题目链接:http://acm.zzuli.edu.cn/problem.php?id=2490
时间限制: 1 Sec  内存限制: 128 MB

题目描述

JK学会了一个有趣的魔法,他可以把两个质量相同的物品合成为一个,新物品质量为两个物品的总和 
JK来到了一个金矿场前,里面有n个金块,重量不一 
jk只能带走一块金子,幸好他可以进行合成,你能帮Jk算出他最大可以拿走多重的金子吗 

输入

第一行输入n,代表金块的数量(1<=n<=100000) 
第二行输入n个数ai,2的ai次方代表金块的重量(1<=ai<=100000) 

输出

输出金子的最大重量
当最大重量可以用2的m次方表示时,输出m即可

样例输入

3
1 2 3
3
1 3 3

样例输出

3
4

解题思路

用一个数组来存每个物品有多少个,即a[m]表示重量为的个数,又因为两个相等的物品可以合成一个物品,所以两个重量为的物品可以合成一个重量为的物品即a[m]-=2,a[m+1]+=1.同理,a[m+1]-=2,a[m+2]+=1...最后只需要找出最大的就行了。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int a[100010];
int main()
{
    int n, m, maxn;
    while (~scanf("%d", &n))
    {
        maxn = 0;
        memset(a, 0, sizeof(a));
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &m);
            while (++a[m] > 1)
                a[m++] -= 2;
            maxn = max(maxn, m);
        }
        printf("%d\n", maxn);
    }
    return 0;
}