ACM ICPC 2008–2009, NEERC, Northern Subregional Contest Problem K. Key to Success

题意:给n个数,问再添加哪m个数可以使这些数凑成他们所能构成的区间内任意数

原题链接:http://codeforces.com/gym/100623/attachments


 

太坑了,题目说m >= 1,实际上会有m = 0的情况

哎,其实就是贪心,1肯定要有,然后维护前缀和往后凑就行

#include <bits/stdc++.h>
#define rep(i, l, r) for(int i=l; i<=r ;i++)
using namespace std;

typedef long long ll;
typedef pair<int, int> PII;
typedef vector<int> VI;
ll gcd(ll n, ll m) { return n % m == 0 ? m : gcd(m, n % m);}

template <typename T>
void read(T& x)
{
    x = 0;
    T flag = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9') {
        if(ch == '-') flag = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9') {
        x *= 10LL;
        x += ch - '0';
        ch = getchar();
    }

    x *= flag;
}

int main()
{
    //ios::sync_with_stdio(false);
    freopen("key.in", "r", stdin);
    freopen("key.out", "w", stdout);

    int n, m;
    read(n), read(m);
    VI a;
    rep(i, 1, n){
        int x;
        read(x);
        a.push_back(x);
    }

    sort(a.begin(), a.end());
    ll sum = 0;
    for(ll i : a){
        while (i > sum + 1 && m){
            printf("%lld ", sum + 1);
            sum += sum + 1;
            m--;
        }

        sum += i;
    }

    while(m){
        printf("%lld ", sum + 1);
        sum += sum + 1;
        m--;
    }

    return 0;
}

 

posted @ 2020-04-12 11:20  雾里尘埃  阅读(188)  评论(0)    收藏  举报