解题:CF1130E Wrong Answer

题面

巧妙构造题

这种题一定要限制一个条件,使得在这个条件下能推出要叉的代码的式子

令序列$a$的第一个元素为负,其余元素为正,且保证序列中至少有两个元素,那么Alice的代码将会从第二个元素开始计算,得到$(n-1)*(sum-a[1])$的答案。而这里答案实际可能有两种,Alice那样的$(n-1)*(sum-a[1])$和全部选取的$n*sum$(因为后面全是正的所以其他方案一定劣于这两种)。我们后者-前者作个差得到$sum-n-a[1]$,不妨令$a[1]=-1$,那么只需要构造一个长度为$n$而总和为$k+n-1$的序列即可

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=2005,Maxx=1e6;
 6 int k,s,p,a[N];
 7 int main()
 8 {
 9     scanf("%d",&k);
10     a[p=1]=-1,s=-1;
11     while(p!=2000)
12     {
13         a[++p]=Maxx,s+=a[p];
14         if(s-p+1>k) {s-=a[p],a[p]-=s+a[p]-p+1-k; break;}
15     }
16     s=0;
17     for(int i=1;i<=p;i++) s+=a[i];
18     if(s!=k+p-1) printf("-1");
19     else
20     {
21         printf("%d
",p);
22         for(int i=1;i<=p;i++)
23             printf("%d ",a[i]);
24     }
25     return 0;
26 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/10429657.html