题目传送门: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 }