思路:2^1 2 ^1 两个数加起来可以变成 2 ^2 ,所以只需要遍历一遍,将两个相同的数遍成一个加1的数,最后统计剩下的数就是最少的举重次数。 下面就用两种方法来写这道题。
`
#include <bits/stdc++.h>
using namespace std;
int cnt[2000050];
int main()
{
int n;
while(cin>>n){
memset(cnt,0,sizeof(cnt));
int ans = 0;
for(int i=0;i<n;i++){
int x; cin>>x;
cnt[x]++;
}
for(int i=0;i<2000050;i++){
if(cnt[i]>=2){
cnt[i+1] += cnt[i]/2;
cnt[i]%=2;
}
}
for(int i=0;i<2000050;i++){
if(cnt[i]) ans++;
}
cout<<ans<<endl;
}
return 0;
}
方法2:
#include <bits/stdc++.h>
using namespace std;
set<int>s;
int main()
{
int n;
while(cin>>n)
{
s.clear();
for(int i=1; i<=n; i++)
{
int a;
cin>>a;
while(s.count(a))
{
s.erase(a);
a++;
}
s.insert(a);
}
cout<<s.size()<<endl;
}
}