题目:CF305C Ivan and Powers of Two
题目
让我们加上最少个数的 2 x 2^x 2x,来满足给定序列 + 2 x 1 + 2 x 2 + ⋯ + 2 x n = 2 v +2^{x1}+2^{x2}+\dots+2^{xn}=2^v +2x1+2x2+⋯+2xn=2v。
思路
所以我们初步的思路就是从 0 0 0 遍历到 n − 1 n-1 n−1,如果有一样的数字,进位。
而且题目已经帮我们排序好了,所以就不用再排序了。(哎嘿,真省事哎)
那么就可以用 set
来维护。
代码
#include <bits/stdc++.h>
using namespace std;
set <int> s;//要维护的set
int main()
{
int n , a , maxn = -2e9;
cin >> n;
for(int i = 1; i <= n; i++)//真正意义上做到了《边读边处理》
{
cin >> a;
while(s.count(a) != 0)
{
s.erase(a);
a ++;
}
s.insert(a);
maxn = max(maxn , a);
}
cout << maxn - s.size() + 1 << endl;//输出
return 0;//完美结束
}
温馨提示:
题目千万条,诚信第一条,代码不规范,棕名两行泪。别抄我的,也别抄别人的昂。