题目链接:https://vjudge.net/problem/Gym-100623K
题意:给你n枚硬币,让你往里面添加m枚硬币,使得这n+m枚硬币,能组成1到x的所有的数,且x尽可能的大
解析:这题和广工校赛决赛的最后一题很像,只是多了一个添加操作而已,每次添加都添加当前的sum+1即可,剩下的还是那样维护就好了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1e5+100;
const int inf = 0x7fffffff;
int a[50];
vector<long long>ans;
int main(void)
{
freopen("key.in","r",stdin);
freopen("key.out","w",stdout);
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
long long sum = 0;
int i=0;
sort(a,a+n);
while(m)
{
if(a[i]<=sum+1 && i<n)
{
sum += a[i];
i++;
}
else
{
ans.push_back(sum+1);
sum = 2*sum+1;
m--;
}
}
for(int i=0;i<ans.size();i++)
{
if(i)printf(" ");
printf("%I64d",ans[i]);
}
puts("");
return 0;
}