搬货物(51Nod-1596)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011815404/article/details/89521651

题目

现在有n个货物,第i个货物的重量是 2^wi 。每次搬的时候要求货物重量的总和是一个2的幂。问最少要搬几次能把所有的货物搬完。

输入

单组测试数据。
第一行有一个整数n (1≤n≤10^6),表示有几个货物。
第二行有n个整数 w1,w2,...,wn,(0≤wi≤10^6)。

输出

输出最少的运货次数。

输入样例

5
1 1 2 3 3

输出样例

2

样例解释:

1,1,2作为一组。

3,3作为一组。

思路:

如果 i 次幂的个数大于 1,那么就让他的 i+1 次幂的个数 +1

如果 i 次幂的个数是偶数个,那么可合成的 i+1 次幂的个数为 n/2

如果 i 次幂的个数为 1,说明无法合成,就得消耗一次

源程序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 1000000+5;
const int dx[] = {-1,1,0,0};
const int dy[] = {0,0,-1,1};
using namespace std;

int bucket[N*2];
int main() {

    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++) {
        int x;
        scanf("%d",&x);
        bucket[x]++;
    }

    int sum=0;
    for(int i=0; i<=1000000; i++) {
        if(bucket[i]) {
            sum+=bucket[i]%2;
            bucket[i+1]+=bucket[i]/2;
        }
    }

    for(int i=1000001; bucket[i] ; i++) {
        sum+=bucket[i]%2;
        bucket[i+1]+=bucket[i]/2;
    }
    printf("%d\n",sum);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011815404/article/details/89521651