<span>cf 1305 E. Kuroni and the Score Distribution</span>
题目传送门: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 }