先全都扔到优先队列里(最小堆),然后出队最小的两个,如果相等的话,合成一个新的再扔到队列里。如果不相等,则把出队那两个其中较小的扔一个单独的数组array里,另一个大一点的再扔回队列里,直到队列为空。array的尺寸就是结果。
我做的时候最后一个没再放回队列,所以是array.size()+1
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
ios::sync_with_stdio(false);
LL n;
LL good;
cin >> n;
priority_queue<LL,vector<LL>,greater<LL>> que;
vector<LL> remain;
while(n--)
{
cin >> good;
que.push(good);
}
LL a,b;
while(!que.empty())
{
a = que.top();
que.pop();
if(que.empty())
{
que.push(a);
break;
}
b = que.top();
if(a == b)
{
que.pop();
que.push(a+1);
}
else
remain.push_back(a);
}
cout << remain.size()+1 << endl;
return 0;
}