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;
}