题目链接:
https://odzkskevi.qnssl.com/bf224a6abe30b2581b0f33f6bc394c79?v=1523035391
【K题思路;】
模拟凑数问题,如果前缀和 小于后面的数 -1 那么说明 中间某个数是凑不出来的,
就需要加上sum+1 这个数。
如果说都能凑出来那么, 再加一个 sum+1 在 sum - sum+sum+1 之间的数都可以凑出来‘
【code】
#include <iostream>
#include <bits/stdc++.h>
typedef long long ll;
const int MAXN=1e5+5;
using namespace std;
vector<ll>V,ans;
int main()
{
freopen("key.in","r",stdin);
freopen("key.out","w",stdout);
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
ll x;
cin>>x;
V.push_back(x);
}
int cot=0;
sort(V.begin(),V.end());
ll sum=0;
for(;cot<m;cot++)
{
sum=0;
sort(V.begin(),V.end());
for(int i=0;i<V.size();i++)
{
if(sum<V[i]-1)
{
V.push_back(sum+1);
ans.push_back(sum+1);
break;
sum+=1;
}
sum+=V[i];
}
}
// cout<<sum<<endl;
if(ans.size()<m)
{
int up=(m-ans.size());
for(int cot=0;cot<up;cot++)
{
ans.push_back(sum+1);
sum+= sum+1;
}
}
for(int i=0;i<ans.size();i++)
{
if(i==0)
cout<<ans[i];
else
cout<<" "<<ans[i];
}
cout<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
123