标签:
http://acm.hdu.edu.cn/showproblem.php?pid=2796
题意:一堆不同大小的coin分成堆。
条件是:当前堆得top size要大于当前堆得所有coin;当前堆的top size要大于前一堆的top size;当前堆的coin个数要大于前一堆。
求最大能分成多少堆。
思路:要想堆数最大,就要需要让没有堆的top size尽量小。所以最优的时候是i堆有i个coin,所以我们尽可能的构造这个情形。最后将剩余的直接放到最后一堆即可。
所以需要先排序,然后扫一遍数组判断条件即可。注意当前堆的top size要是唯一的
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[100],n; int main(){ while(scanf("%d",&n)!=EOF){ memset(a,0,sizeof(a)); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } sort(a,a+n+1); int k=1; int fro=a[1]; int site=1; int left=0; for(int i=2;i<=n;i++){ if(a[i]>fro&&i-site+left>=k+1&&a[i]!=a[i-1]){ fro=a[i]; left=i-site-k-1+left; site=i; k++; }else continue; } printf("%d\n",k); } return 0; }
标签:
原文地址:http://www.cnblogs.com/Yvettey-me/p/4701683.html