[UOJ 282]长度测量鸡

Description

Input

Output

Sample Input

2
1
100

Sample Output

1
-1

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 }

 

转载于:https://www.cnblogs.com/NaVi-Awson/p/7264041.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值