思路就是二进制
把所有的数累加起来,然后看二进制有多少个1
转换一下,因为2^1e6很大,存不下,可以用数组记录二进制的大小
然后对数组进行二进制加法。求出来最后1的个数
例如 样例
a[1]=2 a[2]=1 a[3]=2
然后二进制加法计算 a[1]=0,a[2]=0.a[3]=1,a[4]=0;a[5]=1;
对应相加:2^3+2^5=24 就是输入的和
判断二进制中1的个数
要注意的是有几个点是卡输入!!
不能用scanf输入。长知识了真的是
#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<cstdio>
using namespace std;
#define maxn 1000500
int a[maxn]={0};
int read(){
char c=getchar();
int sum=0;
while(c>='0'&&c<='9'){
sum=sum*10+c-'0';
c=getchar();
}
return sum;
}
int main(){
int n;
scanf("%d",&n);
int sum=0,num;
getchar();
for(int i=0;i<n;i++){
num=read();
a[num]++;
}
for(int i=0;i<maxn-1;i++){
a[i+1]+=a[i]/2;
if(a[i]&1) sum++;
}
printf("%d\n",sum);
return 0;
}