[UOJ282]长度测量鸡

思路:

数学归纳。

设最少所需刻度数为$s$,则$n和s$的关系为:

$n=1,s=0;$

$n=2,s=1;$

$n=3,s=3;$

...

观察发现$s=n(n-1)/2$,得到$sn$时,满足条件。

然而只有50分。。

因为我手算错了,$n=3,s=2$。

然而人不能没有信仰,就把$<$改成$\leq$,A了。。

正解:

当$n>3$时,一定不能满足条件。

官方题解

from nneztlk

算法一

直接枚举刻度, 时间复杂度为 O((n(n+1)/2−1n−1))O((n(n+1)/2−1n−1)). n=5n=5 时这个数是 (144)=1001(144)=1001, n=8n=8 时这个数是 (357)=6724520(357)=6724520. 期望得分 10∼2010∼20 分.

算法二

我们需要题目描述中的 sj−si (0≤i<j≤n)sj−si (0≤i<j≤n) 这 n(n+1)2n(n+1)2 个数取到 1∼n(n+1)21∼n(n+1)2 的所有整数, 所以每个整数只能取一次, 即每种长度只能被一种方法量出. 特别地, si−si−1(1≤i≤n)si−si−1(1≤i≤n) 这 nn 段长度两两不同, 故只能是 1,2,…,n1,2,…,n 的一种排列.

枚举排列, 时间复杂度为 O(n!)O(n!). n=8n=8 时这个数是 4032040320. 期望得分 2020 分.

算法三

事实上, n=1,2,3n=1,2,3 时可以直接试出刻度方案, 分别为 ∅,{1},{1,4}∅,{1},{1,4}, 而对所有 n>3n>3 都不存在满足要求的刻度. 证明如下:

记 M=n(n+1)2M=n(n+1)2, 则对 n>3n>3, M≥10M≥10. 现假设存在满足要求的刻度方案. 由于需要量出 M−1M−1 的长度, 所以 11 或 M−1M−1 处必须有刻度, 由对称性不妨设 11 处有. 要量出 M−2M−2 的长度, 2,M−2,M−12,M−2,M−1 中需要有一处有刻度, 而如果 22 或 M−1M−1 处有刻度, 则可以用两种方法量出长度 11, 矛盾! 所以 M−2M−2 处必须有刻度. 此时由 (M−2)−1=M−3(M−2)−1=M−3, M−3M−3 的长度已经可以被量出. 要量出 M−4M−4 的长度, 2,4,M−3,M−42,4,M−3,M−4 四处必有一处有刻度. 容易发现只有 44 处的刻度不会引起重复.

现在已经知道 1,4,M−21,4,M−2 处都需要有刻度, 而长度 M−5M−5 尚未被量出. 欲量出 M−5M−5, 需要 3,5,M−5,M−4,M−13,5,M−5,M−4,M−1 中的一处有刻度. 然而它们都会导致 1,2,31,2,3 中的某个长度能被两种方法量出, 矛盾! 故不存在满足要求的刻度.

所以只需判断 nn 是否大于 33. 时间复杂度 O(1)O(1), 期望得分 100100 分.

我的AC代码:

 1 #include<cstdio>
 2 int main() {
 3     int t;
 4     scanf("%d",&t);
 5     while(t--) {
 6         int n;
 7         scanf("%d",&n);
 8         printf("%d\n",((n*(n+1)>>2)<=n)?1:-1);
 9     }
10     return 0;
11 }

最短代码(Python2.7):

1 print‘\n‘.join([‘-1‘if input()>3 else‘1‘for i in range(input())])
时间: 2024-07-28 21:57:18

[UOJ282]长度测量鸡的相关文章

UOJ Goodbye Bingshen

在叶子童鞋的推荐下打了这场比赛... 感觉被虐爆了... 怎么这么多构造题... 我还没写过呢... 交互题是毛线...看了好久没看懂...就放弃了...(我语文好差QAQ...) 最后只会T1...T2没时间了,就随便水了一发...居然拿了30分(rp--)... 下面有一些是自己/小伙伴YY的想法...有一些是题解...先放官方题解... 就不放题面了...复制过来效果很神奇... A. 长度测量鸡 分析: 这个你脑补一下,划分成的长度一定是1~n的某个全排列,然后算一算,发现能够组合出来的

《鸡啄米C++编程入门系列》系列技术文章整理收藏

<鸡啄米C++编程入门系列>系列技术文章整理收藏 收藏整理鸡啄米C++编程入门系列文章,供个人和网友学习C++时参考 1鸡啄米:C++编程入门系列之前言 2鸡啄米:C++编程入门系列之一(进制数) 3鸡啄米:C++编程入门系列之二(原码.反码与补码) 4鸡啄米:C++编程入门系列之三(VS2010的使用介绍) 5鸡啄米:C++编程入门系列之四(数据类型) 6鸡啄米:C++编程入门系列之五(运算符和表达式) 7鸡啄米:C++编程入门系列之六(算法的基本控制结构之选择结构) 8鸡啄米:C++编程入

C/C++算法竞赛入门经典Page9 例题1-4 鸡兔同笼

题目:鸡和兔总数:n,总腿数:m.输入n,m,输出鸡和兔分别的数量;无解则输出"No answer" 样例输出1: 14 32 样例输出1: 12 2 样例输入2: 10 16 样例输出2: No answer 首先,声明两个变量n,m对应总数和总腿数;再声明两个变量为鸡和兔各自的数量a,b 1 int n,m,a,b; 输入n,m: scanf("%d%d",&n,&m); 通过联立方程组: a+b=n 2a+4b=m 得: a=(4n-m)/2;

鸡国福利

鸡国福利 时间限制: 1 Sec  内存限制: 128 MB 题目描述 鸡国为了表彰鸡国每一只鸡在过去一年的优秀表现,打算在接下来的 n 天中每天给鸡国的一只鸡发 1 袋或者 2 袋“鸡币”(鸡国的通用货币)作为福利.国王要求每天来领钱鸡互不相同,即来领过钱的鸡不能再来,否则将受到严厉的处罚. 但聪明的鸡国老百姓侦察后发现国王每天发的钱袋子里面装的钱数量是不一样的(同一天的相同),第 i 天发的每一袋钱为 a i 元.如果第 i 天来领钱的鸡领 1 袋钱,它可以获得ai 元的“鸡币”,如果它领

3. 百钱买白鸡问题

这是一个古老而非常经典的问题,最早源自中国古代的算经,中国古代数学家张丘建在他的算经中提出了著名的百钱买白鸡的问题: 鸡翁1, 值钱5,鸡母1,值钱3,鸡雏3值钱1,百钱买白鸡,问翁,母,雏各几何? 100文钱买100只鸡,公鸡5文钱一只,母鸡3文一只,小鸡3只1文钱:100文钱买了100只鸡,请问公鸡,母鸡,小鸡各有多少? #include <stdio.h> #include <stdlib.h> int main() {     int i,j,k;     for(i=0;

鸡年人日立春遣兴

鸡年人日立春遣兴 人日逢春兴味长,重新唤起少年狂. 赏佳山水身真忘,嚼好诗词齿亦香. 梅朵勾魂观带露,友人萦梦咏为殇. 欲留本命年初喜,照个全家福满堂. 翰苑诸贤各较长,诗魔诗鬼并诗狂. 生花笔底山川丽,吐瑞唇边气味香. 飞去江南吟玉韵,归来塞北奉瑶觞. 一时紫府招仙客,某等纷纷入殿堂!

已知笼中有头h个,有脚f条,问笼中鸡兔各有多少只

描述    已知笼中有头h个,有脚f条,问笼中鸡兔各有多少只, 如果无法组成    输入    h(0<h<2147483647)    f(0<f<2147483647)    输出    鸡的数目    兔子的数目 public class Main {     public static void main(String[] args){         int h = 0;         int f = 0;         Scanner scanner = new S

百鸡百钱问题

描述    我国古代数学家张丘建在<算经>一书中提出的数学问题:        鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一.        百钱买百鸡,问鸡翁.鸡母.鸡雏各几何?    输入        输出    鸡翁数量    鸡母数量    鸡雏数量 public class Main {     public static void main(String[] args){                  for (int i = 1; i <= 20; i++) {     

百鸡百钱while做法

//百鸡百钱 公鸡2文,母鸡1文,小鸡0.5文 int count = 0; int gong = 0; while (gong<=50) { int mu = 0; while(mu<=100) { int xiao = 0; while(xiao<=200) { if(gong+mu+xiao==100&&2*gong+mu+0.5*xiao==100) { count++; Console.WriteLine("第"+count+"种组