555 div3 D. N Problems During K Days*

  题意:给定n和k  判断是否能用一串长度为k的a来表示   a的和为n

且满足

a[i]<a[i+1]

a[i+1]<=2*a[i]

显然是等差和等比的关系

注意特判  

8 3  和4 2 时无解 

然后从后往前补即可

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
ll n,k;
const int N=1e6;
ll a[N];
int main()
{
    cin>>n>>k;
    ll temp=(1+k)*k/2;

    if(n<temp||n==8&&k==3||n==4&&k==2)return cout<<"NO",0;

    n-=temp;
    ll t=n/k;
    n-=t*k;
    
    rep(i,1,k)
    a[i]=i+t;
    while(n)
    {
        repp(i,k,2)//显然不可能再补1了  
        {
            if(a[i]+1<=a[i-1]*2)a[i]++,n--;
            else break;
            if(!n)break;
        }
    }
    cout<<"YES"<<endl;
    rep(i,1,k)
    printf(i==1?"%lld":" %lld",a[i]);

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/bxd123/p/10876004.html