0
点赞
收藏
分享

微信扫一扫

贪心【Luogu P1190】【acwing104】

zhoulujun 03-15 19:30 阅读 2

Luogu P1190排队接水

每次找到出水量最小的水龙头,把该接水的同学排到它下边

贪心思想:只要有同学排队,就往水龙头上安排,别让水龙头闲着。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int n,m,w[10005]; //w:每人的接水量
int s[105]; //s:每个水龙头的出水量

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++) scanf("%d",&w[i]);
  for(int i=1,t; i<=n; i++){
    t=1;
    // 找到出水量最少的水龙头
    for(int j=2;j<=m;j++)
      if(s[t]>s[j]) t=j;
    s[t]+=w[i];
  }
  int mx=0;
  for(int i=1;i<=m;i++) mx=max(mx,s[i]);
  printf("%d\n",mx);
}

可用小根堆优化:其实哪个水龙头、哪个人并不关键,只要关注最短时间即可

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;

int n,m,w[10005]; //w:每人的接水量
priority_queue<int,vector<int>,greater<int> >s; //s:每个水龙头的出水量

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++) scanf("%d",&w[i]);
  for(int i=1;i<=m;i++) s.push(0);
  for(int i=1; i<=n; i++){
    int t=s.top(); s.pop();
    s.push(t+w[i]);
  }
  for(int i=1;i<m;i++) s.pop();
  printf("%d\n",s.top());
}

Luogu P1209修理牛棚

初始给每个牛一块板子,根据牛棚见间隔排序,从小到大一个一个去掉板子。实际上是差分的感觉,实现贪心思想。

#include <iostream>
#include <cstring>
#include <algorithm>
#define N 205
using namespace std;

int m,s,c,ans;
int a[N]; //牛所占的牛棚的编号
int d[N]; //相邻牛之间的牛棚数

int main(){
  scanf("%d%d%d",&m,&s,&c);
  for(int i=1;i<=c;i++)scanf("%d",&a[i]);
  
  sort(a+1,a+c+1);
  for(int i=2;i<=c;i++)d[i-1]=a[i]-a[i-1]-1;//差分的感觉
  sort(d+1,d+c);
  
  ans=c;  //先给每个牛一块木板
  if(m<c) //如果木板数小于牛数
    for(int i=1;i<=c-m;i++) ans+=d[i]; //加空档
  printf("%d\n",ans);
  return 0;
}

104. 货仓选址 - AcWing题库

中间位置的数即为选址

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main(){
	cin>>n;
	for(int i = 1; i<=n; i++) cin>>a[i];
	sort(a, a+n);
	int res = 0;
	for(int i = 0; i<n; i++)
		res += abs(a[i] - a[n/2]);//每次减去中间数
	cout<<res;
	return 0;
}

举报

相关推荐

0 条评论