描述
题解
猛一看好心塞,不会做,但是抱着试试的心态写写画画,然后发现还是我对二进制知之甚少,原来只要先将序列中每一次方的数目存入数组,然后对应进位即可。好渣啊我~~~ 最近几天荒了些许,好几天没有做题了/(ㄒoㄒ)/ ~~不做题果然手生啊!
这道题要强调两点,第一卡I\O了,需要用输入外挂,第二,第二个 for 循环中之所以要在判断条件MAXW 的基础上加100,是因为存在进位,可能会超过MAXW很多位,最开始用的10,WA 了两组,后改为100,过了,大概50也能过,没有尝试。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 1e6 + 111;
int W[MAXN];
template <class T>
inline void scan_d(T &ret)
{
char c;
ret = 0;
while ((c = getchar()) < '0' || c > '9');
while (c >= '0' && c <= '9')
{
ret = ret * 10 + (c - '0'), c = getchar();
}
}
int main(int argc, const char * argv[])
{
memset(W, 0, sizeof(W));
int n;
cin >> n;
int w, MAXW = 0;
for (int i = 0; i < n; i++)
{
scan_d(w);
MAXW = max(w, MAXW);
W[w]++;
}
int res = 0;
for (int i = 0; i < MAXW + 100; i++)
{
if (W[i] > 1)
{
W[i + 1] += W[i] / 2;
W[i] %= 2;
}
res += W[i];
}
cout << res << '\n';
return 0;
}