给定一个数组,有n个数字,问你再添加m个数字。
使得这些数不能拼凑起来的数尽可能的大。
完全没有思路。写一遍二进制就会发现有这样一个贪心的规律
维护一个 前缀和,如果前缀和+1
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=50;
long long a[maxn];
int m,n;
void chuli()
{ int i=1;
long long sum=0;
queue<long long>q;
while(i<=m&&n)
{ while(sum+1<a[i]&&i<=m&&n)
{//内层也要限制定,不能无条件加啊。毕竟是while
q.push(sum+1);
sum=2*sum+1;
n--;
}
sum+=a[i++];
}
while(n)
{ q.push(sum+1);sum+=sum+1;n--;
}
int ans=0;
while(!q.empty())
{ if(ans++) printf(" ");
printf("%lld",q.front());
q.pop();}
cout<<endl;
}
int main()
{
freopen("key.in", "r", stdin);
freopen("key.out", "w", stdout);
memset(a,-1,sizeof(a));
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
scanf("%lld",&a[i]);
sort(a+1,a+m+1);
chuli();
return 0;
}