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 }

 

posted @ 2020-03-04 18:20  sewage  阅读(233)  评论(0编辑  收藏  举报