巧妙构造题
这种题一定要限制一个条件,使得在这个条件下能推出要叉的代码的式子
令序列$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 }