题目大意是: 给你n 个数, Wi ; 让你求这n个数 最少可以划分为多少组数, 使得每组数中2a1 + 2a2 + ... + 2ak = 2x
也就是说找出最少的组数, 使得每组中 pow(2, 每个数) 的和 == pow(2, x); x可以为任意整数;
解题思路: 这个题可以直接用hash法来解; 只要有两个相同的数, 那么他们的位就进1, 也就是hash表中的后一位数加1;
这里要注意不是一直到1e6 就结束了, 他的极限数据是1000000个1000000, 所以为了有向后递推的空间, 最好将hash表开到10的6次方+1000;
下面是我的代码!
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 100;
int a[maxn];
int main() {
int n;
scanf ("%d", &n);
memset (a, 0, sizeof (a) );
int x;
for (int i = 0; i < n; i++) {
scanf ("%d", &x);
a[x]++;
}
int ans = 0;
for (int i = 0; i < maxn; i++) {
ans += a[i] % 2;
a[i + 1] += a[i] / 2;
}
printf ("%d\n", ans);
}