ACM ICPC NEERC, Northern Subregional Contest K:Key to Success

题目链接:

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

posted @ 2018-04-10 12:46  Sizaif  阅读(138)  评论(0编辑  收藏  举报