题目链接:51nod 1837 砝码称重

小 Q 有 n 个砝码,它们的质量分别为 1 克、 2 克、……、 n 克。

他给 i 克的砝码标上了编号 i (i = 1, 2, ..., n),但是编号被人打乱了,即编号为 i 的砝码不一定是 i 克,而是 a_i 克,这里 a 指的是 1 到 n 的一个排列。

他有一杆天平,可以向天平的两侧放任意数量的砝码,通过一次称量得到两侧质量的大小关系,关系只有左侧重、一样重、右侧重三种可能。
他想知道,最坏情况下,他至少需要称量多少次,才能确定其中至少一个编号为 i 的砝码的质量是 i 克或不是 i 克。
 
提示:这里所谓的最坏情况是指,对于固定的、按顺序进行的称量操作,不论每次称量的结果是什么,都能完成所需完成的上述判定任务。
 
例如 n = 6 时,可以只称量一次,选择编号为 1、 2、 3 的砝码放在左侧,编号为 6 的砝码放在右侧。
如果天平不是平的,则可以确定存在至少一个砝码 i 不是 i 克 (i = 1, 2, 3, 6),否则编号为 6 的砝码一定是 6 克。
 
再例如 n = 5 时,可以只称量两次,第一次选择编号为 2、3 的砝码放在左侧,编号为 5 的砝码放在右侧,第二次选择编号为 1、4 的砝码放在左侧,编号为 5 的砝码放在右侧。
这里略去这样称量的正确性,留给做题人推导和证明。
Input
输入包含多组测试数据。
每行对应一组测试数据,包含一个正整数 n 。
不超过 10^5 组数据,1 ≤ n ≤ 10^9。
Output
每行对应一组测试数据,输出一个正整数表示答案。
Input示例
1
5
6
Output示例
0
2
1

题解:最先猜到1,3,6,10,15这些数比较特殊,都只要称一次,因为:

3=1+2,6=1+2+3,10=1+2+3+4......

然后猜想其他数应该和其组合有关,比如5=1+4和2+3,然后4里面有1+2和1+3(事实上只要124,判断1+2<4就行了),然后猜测要称的次数和最大砝码的加法组合有关(必须有一边要放一个,因为题目说要确定哪个错了,唔其实这里开始就想错了)。。然后,没猜出来。。。其中还猜想过答案只有1和2吧,但是我不会证明吖QAQ,后面越算越糊涂,弃疗。。。

不扯了,,,花个点头盾,

来看正解:(答案就是只有1和2哎。。。高斯证明过任意一个正整数可以表示成三个三角形数的和)

①如上猜想,1,3,6,10这样的三角形数k*(k+1)/2,都只要一次,选出k个数之和判断是否与n相等即可,因为任选k个数组成的最小质量和是n。

②n 等于 三角形数+1的也只要一次,与上同理,判断选出k个数是否<n即可

③当第n个三角形数是平方数时,只要一次,判断1+2+...+(k-1)=(k+1)+(k+2)+...+n是否成立,因为去掉一个砝码后能够拆分成两个质量和相同的砝码区间只有一种方案。

当第n个三角形数是平方数+1时,只要一次,与上同理。

⑤其他情况,n,n-1,n-2中至少有一个数可以表示成两个三角形数的和,从而只需要称两次,因为小于号可以使用至多两次。

(判断一个数是不是平方数只需要将其开根下取整再平方进行检验,判断三角形数同理。)

 #include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll n, t, k, kk;
int main() {
while(~scanf("%lld", &n)){
if(n==) {puts("");continue;}
k = sqrt(*n-);
t = n*(n+)/; kk = sqrt(t);
if(k*(k+)/ == n || k*(k+)/ + == n ||
t == kk*kk || t == kk*kk+) puts("");
else puts("");
}
return ;
}

234ms

51nod 1837 砝码称重【数学,规律】的更多相关文章

  1. 51nod 1449 砝码称重 (进制思想)

    1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1,w ...

  2. 51nod 1449 砝码称重(贪心算法)

    题目:传送门. 题意:中文题. 题解:左物右码,w进制.m%w==0||m%w==1||m%w==w-1都是可以的,否则是NO. #include <iostream> #include ...

  3. 51nod 1449 砝码称重【天平/进制】

    题意: 给你w,n,问你在w^0,w^1,w^2...各种一个,问你能不能用这些砝码和重量为m的东西放在天平上使得天平平衡: 思路: 这个很容易联想到进制: 如果把m放在是一边的话,其实对于砝码就是纯 ...

  4. 51Nod 1449 砝码称重 (二进制思想)

    现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组 ...

  5. 51nod 1449:砝码称重

    1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  取消关注 现在有好多种砝码,他们的重量是 w0,w1 ...

  6. NOI题库--砝码称重V2(多重背包2^n拆分)

    以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...

  7. Codevs No.2144 砝码称重2

    2016-05-31 22:01:16 题目链接: 砝码称重2 (Codevs No.2144) 题目大意: 给定N个砝码,求称出M的重量所需砝码最小个数 解法: 贪心 使砝码数量最小,当然是每个砝码 ...

  8. 安徽省2016“京胜杯”程序设计大赛_A_砝码称重

    砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 61 Accepted: 37 Description 小明非常喜 ...

  9. P2347 砝码称重-DP方案数-bitset

    P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...

随机推荐

  1. Firebird 条件函数

    1.iif  IIF (<condition>, ResultT, ResultF) 示例: select iif( sex = 'M', 'Sir', 'Madam' ) from Cu ...

  2. table中列复选框全选,再选 效果

    <table class="table table-striped sortable table-bordered table-hover " id="zdnews ...

  3. Tomcat服务器使用(一)

    1. Tomcat服务器端口的配置 Tomcat服务器的配置文件主要在conf文件夹中,conf文件夹下的server.xml是配置文件的核心,默认的配置端口是8080,如果想要修改为其他的端口,可在 ...

  4. Jmail发送邮件工具类

    好久没更新博客了,实在是拖延症严重啊,好可怕,先更新个工具类吧,之前写的发送邮件的小工具,话不多说上代码 import lombok.extern.slf4j.Slf4j; import java.u ...

  5. ES6中的import()函数

    import(specifier) 上面代码中,import函数的参数specifier,指定所要加载的模块的位置.import命令能够接受什么参数,import()函数就能接受什么参数,两者区别主要 ...

  6. 软件项目技术点(6)——结合鼠标操作绘制动态canvas画布

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 我们创建一个类封装了所有鼠标需要处理的事件. export class MouseEventInfo { el: HTMLElemen ...

  7. 关于background定位

    直到刚刚我才发现我小瞧了background定位 因为项目里需要显示隐藏的按钮上有两个图标 开始想了几种方法都不行,然后突然就想到了background定位 果断试了一下 <input type ...

  8. Android PopupWindow显示位置设置

    当点击某个按钮并弹出PopupWindow时,PopupWindow左下角默认与按钮对齐,但是如果PopupWindow是下图的那样,会发 生错位的情况,尤其是不同尺寸的平板上,那错位错的不是一般的不 ...

  9. 3 TFRecord样例程序实战

    将图片数据写入Record文件 # 定义函数转化变量类型. def _int64_feature(value): return tf.train.Feature(int64_list=tf.train ...

  10. java线程方法join的总结

    虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...