【GMOJ4282】平方數遊戲
阿新 • • 發佈:2020-10-23
題目
題目連結:https://gmoj.net/senior/#main/show/4282
思路
考慮到任意 8 個連續的數必然存在以下方案將和變為 0:
\[a^2-(a+1)^2-(a+2)^2+(a+3)^2-(a+4)^2+(a+5)^2+(a+6)^2-(a+7)^2 \]而通過模擬退火可以得到 \(1\sim 15\) 的答案,發現 \(8\sim 15\) 的結果全部為 \(0\) 或 \(1\),通過奇偶性容易得出這已經是最優解了。
所以打出 \(1\sim 15\) 的表,後面每 \(8\) 個數為一組做即可。
時間複雜度 \(O(n)\)。
程式碼
#include <bits/stdc++.h> using namespace std; int n; void check(int n) { if (n==1) printf("1\n1 "); if (n==2) printf("3\n1 -1 "); if (n==3) printf("5\n1 1 -1 "); if (n==4) printf("2\n1 1 1 -1 "); if (n==5) printf("3\n-1 1 -1 -1 1 "); if (n==6) printf("1\n-1 1 -1 1 1 -1 "); if (n==7) printf("0\n-1 -1 1 -1 1 1 -1 "); if (n==8) printf("0\n-1 1 1 -1 1 -1 -1 1 "); if (n==9) printf("1\n-1 1 1 1 -1 -1 1 1 -1 "); if (n==10) printf("1\n-1 1 -1 -1 1 -1 -1 1 -1 1 "); if (n==11) printf("0\n1 -1 1 1 1 -1 -1 -1 1 -1 1 "); if (n==12) printf("0\n1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 "); if (n==13) printf("1\n-1 1 -1 1 1 1 -1 1 -1 -1 1 1 -1 "); if (n==14) printf("1\n-1 1 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 "); if (n==15) printf("0\n-1 1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 "); } int main() { freopen("five.in","r",stdin); freopen("five.out","w",stdout); scanf("%d",&n); if (n<=15) check(n); else { check(n%8+8); for (int i=1;i<n/8;i++) printf("1 -1 -1 1 -1 1 1 -1 "); } return 0; }