热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[UOJ282]长度测量鸡

思路:数学归纳。设最少所需刻度数为$s$,则$n和s$的关系为:$n1,s0;$$n2,s1;$$n3,s3;$观察发现$sn(n-1)2$,得到$

思路:

数学归纳。

设最少所需刻度数为$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&#x2212;1n&#x2212;1))">O((n(n+1)/21n1))O((n(n+1)/2−1n−1)). n=5">n=5n=5 时这个数是 (144)=1001">(144)=1001(144)=1001, n=8">n=8n=8 时这个数是 (357)=6724520">(357)=6724520(357)=6724520. 期望得分 10&#x223C;20">102010∼20 分.

算法二

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

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

算法三

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

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

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

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

 

我的AC代码:

 1 #include
 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())])

 


推荐阅读
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
author-avatar
so的青春
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有