CodeForces 587A

题目链接:

 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
",sum);
 }
 return 0;
}

  

原文地址:https://www.cnblogs.com/www-cnxcy-com/p/5539664.html