分队问题【贪心】【DP】
题目大意:
5
2
1
2
2
3
2
思路:
听说贪心不可以???
嗨嗨皮皮贪心水过。
贪心无法AC的原因是当一个队伍的人数满足要求了,你不知道应该把下一个人排在这个队伍里还是再新开一个队伍来放,有时新开一个队伍反而会使答案不是最优。比如说上面给出的反例。但是我们只要判断好放在原来队伍更优还是新开队伍更优就行了。而且贪心代码十分简洁,比DP要更加短而容易理解。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int peo[2000001],n,ans,sum,ok;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&peo[i]);
ok=1; //是否是第一个人的判断
sort(peo+1,peo+1+n,cmp); //排序
sum=peo[1];
for (int i=1;i<=n;i++)
{
if (peo[i]<sum&&!ok) sum=peo[i]; //放前面更优而且不是第一个人(前面有队伍)
sum--; //队伍要求人数减一
if (!sum) //队伍人数达到要求
{
ok=0; //不是第一个人
sum=peo[i]; //新开队伍
ans++;
}
}
return printf("%d\n",ans)&0;
}