贪心数列构造——cf1157D

一开始将数列设置为0 1 2 3 4 5 6.。。

然后从左到右遍历,每位不够就增加即可

#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define ll long long 
ll a[maxn],n,k;
int main(){
    cin>>n>>k;
    ll sum=(0+k-1)*k/2;
    if(sum>n){
        puts("NO");
        return 0;
    }
    a[0]=-1;
    
    for(int i=1;i<=k;i++){
        int now=a[i-1]+1;
        int add=(n-sum)/(k-i+1);
        if(now+add>2*a[i-1] && i>=2)
            add=2*a[i-1]-now;
        sum+=add*(k-i+1);
        a[i]=now+add;
        if(i>=2 && a[i]>2*a[i-1] || sum>n){
            puts("NO");
            return 0;
        }
    }
    if(sum!=n){
        puts("NO");
        return 0;
    }
    
    puts("YES");
    for(int i=1;i<=k;i++)
        cout<<a[i]<<" ";
}

 

posted on 2019-06-11 10:20  zsben  阅读(213)  评论(0编辑  收藏  举报

导航