Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)E(构造)
从1~n构造显然平衡数最大,先尽可能1~i构造,再补一个数填平或者不补,再用大数把数字补全。
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[5007]; 5 int main(){ 6 ios::sync_with_stdio(false); 7 cin.tie(NULL); 8 cout.tie(NULL); 9 int n,m; 10 cin>>n>>m; 11 int sum=0,pos=0; 12 int flag=0; 13 for(int i=1;;++i){ 14 if(i>n){ 15 flag=1; 16 if(sum==m) 17 flag=2; 18 break; 19 } 20 sum+=(i-1)/2; 21 pos=i; 22 if(sum>m){ 23 sum-=(i-1)/2; 24 break; 25 } 26 } 27 if(flag==1){ 28 cout<<-1; 29 return 0; 30 } 31 if(flag!=2) 32 --pos; 33 for(int i=1;i<=pos;++i) 34 a[i]=i; 35 int rem=m-sum; 36 if(rem>0){ 37 int temp=pos/2; 38 a[pos+1]=pos+1+(temp-rem)*2; 39 } 40 if(pos+1<n){ 41 int st=pos+2; 42 if(rem==0) 43 --st; 44 int mx=1e9; 45 int cha=a[st-1]+1; 46 for(int i=n;i>=st;--i){ 47 a[i]=mx; 48 mx-=cha; 49 } 50 } 51 else if(rem==0&&pos+1==n) 52 a[n]=1e9; 53 for(int i=1;i<=n;++i) 54 cout<<a[i]<<" "; 55 return 0; 56 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)