cf 1305 E. Kuroni and the Score Distribution

Posted zcb123456789

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("
");
        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
");
        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("
");
}

 

以上是关于cf 1305 E. Kuroni and the Score Distribution的主要内容,如果未能解决你的问题,请参考以下文章

CF1305F Kuroni and the Punishment

CF1305D Kuroni and the Celebration

CF1305E Kuroni and the Score Distribution

CF1305F Kuroni and the Punishment

CF1305F Kuroni and the Punishment (随机化)

CF1305E Kuroni and the Score Distribution(构造)