Description
Input
Output
Sample Input
2
1
100
Sample Output
HINT
题解
我们需要题目描述中的$s_j−s_i(0≤i<j≤n)$这$n(n+1) \over 2$个数取到$n(n+1) \over 2$的所有整数,所以每个整数只能取一次,即每种长度只能被一种方法量出。特别地,$s_i−s_{i−1}(1≤i≤n)$这$n$段长度两两不同,故只能是$1,2,…,n$的一种排列。
事实上,$n=1,2,3$时可以直接试出刻度方案,分别为∅,{1},{1,4}而对所有$n>3$都不存在满足要求的刻度。证明如下:
记$M$=$n(n+1) \over 2$,则对$n>3$,$M≥10$。现假设存在满足要求的刻度方案。由于需要量出$M−1$的长度,所以$1$或$M−1$处必须有刻度,由对称性不妨设$1$处有。要量出$M−2$的长度,$2$,$M−2$,$M−1$中需要有一处有刻度,而如果$2$或$M−1$处有刻度,则可以用两种方法量出长度$1$,矛盾!所以$M−2$处必须有刻度。此时由$(M−2)−1=M−3$,$M−3$的长度已经可以被量出。要量出$M−4$的长度,$2$,$4$,$M−3$,$M−4$四处必有一处有刻度。容易发现只有$4$处的刻度不会引起重复。
现在已经知道$1$,$4$,$M−2$处都需要有刻度,而长度$M−5$尚未被量出。欲量出$M−5$,需要 $3$,$5$,$M−5$,$M−4$,$M−1$中的一处有刻度。然而它们都会导致$1$,$2$,$3$中的某个长度能被两种方法量出,矛盾!故不存在满足要求的刻度。
所以只需判断$n$是否大于$3$。时间复杂度$O(1)$。
1 #include<set> 2 #include<map> 3 #include<ctime> 4 #include<cmath> 5 #include<queue> 6 #include<stack> 7 #include<cstdio> 8 #include<string> 9 #include<vector> 10 #include<cstring> 11 #include<cstdlib> 12 #include<iostream> 13 #include<algorithm> 14 #define LL long long 15 #define RE register 16 #define IL inline 17 using namespace std; 18 19 int t,n; 20 21 int main() 22 { 23 scanf("%d",&t); 24 while (t--) {scanf("%d\n",&n);printf(n>3 ? "-1\n":"1\n");} 25 return 0; 26 }