1596 搬货物
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
现在有n个货物,第i个货物的重量是 2wi 。每次搬的时候要求货物重量的总和是一个2的幂。问最少要搬几次能把所有的货物搬完。
样例解释:1,1,2作为一组。3,3作为一组。
Input
单组测试数据。
第一行有一个整数n (1≤n≤10^6),表示有几个货物。
第二行有n个整数 w1,w2,...,wn,(0≤wi≤10^6)。
Output
输出最少的运货次数。
Input示例
5
1 1 2 3 3
Output示例
2
思路:把总的货物的重量转化为二进制,二进制位有几个1就需要几次,但是题中给出的是幂,不用先转化为十进制求总的重量,wi刚好就是二进制位,wi出现一次,表示该二进制位为1,再出现的话,就为0,向前进1,最后看二进制中有多少位1.
#include<stdio.h>
using namespace std;
#define num 10000000
int two[num];
int main()
{
int n,a;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
while(two[a]==1)
{//向前进位,直到该位置为0
two[a]=0;
a++;
}
two[a]=1;
}
int sum=0;
for(int i=0;i<num;i++)
{//统计二进制位中1的个数
if(two[i]==1)
sum++;
}
printf("%d\n",sum);
return 0;
}