https://www.51nod.com/Challenge/Problem.html#!#problemId=1596
现在有n个货物,第i个货物的重量是 。每次搬的时候要求货物重量的总和是一个2的幂。问最少要搬几次能把所有的货物搬完。
样例解释:
1,1,2作为一组。
3,3作为一组。
输入
单组测试数据。 第一行有一个整数n (1≤n≤10^6),表示有几个货物。 第二行有n个整数 w1,w2,...,wn,(0≤wi≤10^6)。
输出
输出最少的运货次数。
输入样例
5 1 1 2 3 3
输出样例
2
题目上已经说过每个数是 ,而且每次搬的时候要求货物重量的总和是一个2的幂,两个相同的数i可以合成一个数i+1,
这是因为+=。而新的i+1又可以合成。所以只要一直合成直到不能合成为止。
记录一个最大值,后面用到的是max+200是因为进位是不可能超过200位的。
#include<stdio.h>
#define N 1020000
int a[N];
int main()
{
int n,i,num,ans=0,max=0;
scanf("%d",&n);
while(n--)
{
scanf("%d",&num);
a[num]++;
if(num>max)
max=num;
}
i=0;
while(i<max+200)
{
a[i+1]+=a[i]/2;
ans+=a[i]%2;
i++;
}
printf("%d
",ans);
return 0;
}