思路:题目要求每次搬的货物的重量和必须是2的次方数,给出得数据也是2的次幂,显然,两个货物的重量和为2的次方数,当且仅当这两个货物的次幂相等,所以我们始终保持数组是升序的,当w[i]==w[i+1]时,去掉w[i],w[i+1]++后保留,否则去掉w[i],保留w[i+1],方案数+1。可以用优先队列优化。
但这题卡了输入,需要使用输入挂。。。。。。。
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
#include <memory>
#include <cctype>
#include <bitset>
#include <string>
#include <vector>
#include <climits>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <functional>
//#define FIN freopen("input.txt","r",stdin);
//#define FOUT freopen("output.txt","w+",stdout);
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double eps=1e-8;
const double Pi=acos(-1.0);
const int N=1000100;
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();
}
}
struct cmp
{
bool operator ()(int x, int y)
{
return x > y;//小的优先级高
}
};
priority_queue<int,vector<int>,cmp> que;
int main()
{
int n;
scanf("%d",&n);
int num;
for(int i=0;i<n;i++)
{
scan_d(num);
que.push(num);
}
int ans=0;
int tmp1,tmp2;
while(!que.empty())
{
if(int(que.size()==1))
{
ans++;
break;
}
tmp1=que.top();
que.pop();
tmp2=que.top();
que.pop();
if(tmp1==tmp2)
{
tmp2++;
que.push(tmp2);
}
else
{
ans++;
que.push(tmp2);
}
}
printf("%d\n",ans);
}