标签:
题目链接:
http://codeforces.com/problemset/problem/587/A
题意:
输入n个数,在这n个数中,寻找有多少个数不能消除掉
消除方法:两个相同的数消除后,生成大它一个数,比如两个1消除后可以生成一个2,
解题思路:
可以定义个数组A[6100000],在这里要多定义一些,如果是6000000个数全是6000000,那么新生成的数会达到2^20次方之大,为了防止数组不够用
所以多定义一些比较好。
每输入一个数x,即用A[x]++,即统计这个数已经输入了多少个,如果个数大于2,则A[x+1]++,A[x]-=2;消除两个x,x+1的个数增加1;
所有的数输入完毕后,也已经消除和增加完毕,只需对A数进行判断个数是否为1即是未能消除的累加即可。
程序代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int M=1000000+30; int num[M]; bool cmp(int x,int y) { return x>y; } int main() { int n,sum,i,x; while(scanf("%d",&n)==1) { memset(num,0,sizeof(num)); for(i=0;i<n;i++) { scanf("%d",&x); num[x]++; int k=x; while(num[k]>=2) { num[k+1]++; num[k]=num[k]-2; k++; } } sort(num,num+M,cmp); sum=0; for(i=0;i<n;i++) if(num[i]!=0) sum++; printf("%d\n",sum); } return 0; }
标签:
原文地址:http://www.cnblogs.com/www-cnxcy-com/p/5539664.html