51nod 1596 搬货物 (二进制)

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;
} 

猜你喜欢

转载自blog.csdn.net/BBHHTT/article/details/81664953