cf 1305 E. Kuroni and the Score Distribution

题目链接:http://codeforces.com/contest/1305/problem/E

题意:给你一个n和m,要你构造一个长度为n的序列,且序列满足a[i]<a[i+1],而且必须要有m组a[i]+a[j]=a[k](i<j<k),如果不存在就输出-1.

思路:如果m=0,那就输出n个奇数,否则序列可以从1开始构造,那对于i,他的贡献度为(i-1)/2。如果n个数的总贡献度小于m,那就输出-1,否则就找到第一个x,使前x个数的总贡献度大于等于m。然后输出1到x-1,现在还多了sum[x]-m的贡献度,当每次x+=2时,贡献度就会减1,所以当x加到x+2*(sum[x]-m)就刚好凑齐贡献度,然后剩下的数都比前一个数大x+2*(sum[x]-m)+1就可以了。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
int a[5005];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    if(m==0)
    {
        for(int i=1;i<=n;i++)
            printf("%d ",i*2-1);
        printf("\n");
        return 0;
    }
    int p=-1;
    for(int i=1;i<=n;i++)
    {
        a[i]=a[i-1]+(i-1)/2;
        if(a[i]>=m)
        {
            p=i;
            break;
        }
    }
    if(p==-1)
    {
        printf("-1\n");
        return 0;
    }
    int x=p+2*(a[p]-m);
    for(int i=1;i<p;i++)
        printf("%d ",i);
    printf("%d ",x);
    int y=x+1;
    for(int i=p+1;i<=n;i++)
    {
        x+=y;
        printf("%d ",x);
    }
    printf("\n");
}

 

posted @ 2020-03-04 20:23  ~zcb  阅读(154)  评论(0编辑  收藏  举报