题目链接: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;
}