cf 1305 E. Kuroni and the Score Distribution

Posted lilibuxiangtle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf 1305 E. Kuroni and the Score Distribution相关的知识,希望对你有一定的参考价值。

题目传送门:E. Kuroni and the Score Distribution

题目大意:给n和m,输出n个数,这些数里必须要有m对a[i]+a[j]==a[k]  ( i < j < k )

题解:(这里的a[i]不是题目意思中的a[i])分两种情况:

1. m==0 直接输出n个递增的奇数即可;

2. m!=0; 先打个表找出1~q(q<=n)共有多少对满足i+j==k记录在数组a中,然后找到小于等于m的第一个x;如果x>n或者a[n]<m,输出-1。

否则,输出1到x。如果小于m还差m-a[x]个,x++, 自己写几个数可以发现a[i]-a[i-1]=(i-1)/2; 令y=x+(x-1)/2; y每加2,就会少一对满足条件的,找到y输出。然后判断还差几个数没有输出。输出n-x个数这些数都比前一个大y+1即可不出现满足要求的。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3  
 4 int a[100100];
 5  
 6 int main()
 7 {
 8     int n,m;
 9     cin>>n>>m;
10     a[1]=0;a[2]=0,a[3]=1,a[4]=2;
11     for(int i=5;i<=n;i++){
12         a[i]=a[i-1]+(i-1)/2;
13         if(a[i]>m) break;
14     }
15     int k=-1,l=0;
16     for(int i=1;i<=n;i++){
17         if(a[i]>=m){
18             k=i;
19             break;
20         }
21     }
22     if(m==0){
23         int t=0,ans=1;
24         for(int i=0;i<n;i++){
25             ans+=2;
26             printf("%d ",ans);
27         }
28         return 0;
29     }
30     if(k>n||k==-1){
31         cout<<-1<<endl;
32         return 0;
33     }
34     int flag=0;
35     if(a[k]>m) k--,flag=1;
36     for(int i=1;i<=k;i++){
37         printf("%d ",i);
38     }
39     int x=k/2,y=k;
40     if(flag){
41         y++;
42         while(a[k]+x>m) x--,y+=2;
43         printf("%d ",y);
44         k++;
45     }
46     n-=k;
47     int t=y+1,ans=y;
48     for(int i=0;i<n;i++){
49         ans+=t;
50         printf("%d ",ans);
51     }
52     return 0;
53 }

 

以上是关于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(构造)