题目链接: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. 【tomcat资源映射本地路径配置】

    需要注意的是:eclipse默认的服务器配置是其内置的. 如果使用自定义的tomcate的配置文件需要在服务器中配置: 1:进入到tomcat根目录下,然后vim conf/server.xml,在& ...

  2. button小手设置 css的cursor

    需要对元素的css属性cursor进行设置.cursor可能的值: default 默认(通常是一个箭头) auto 默认.浏览器设置的光标 crosshair 十字线形状. pointer 小手形状 ...

  3. Spring mvc 中 DispatcherServlet 的学习和理解

    上图表示当客户请求来到时,spring架构作出响应的流程,可以从图中看到看到请求分发的中心就是 DispatcherServlet 类,DispatcherServlet的任务是将请求发送给Sprin ...

  4. C#中匿名委托以及Lambda表达式的学习笔记

    一. C#从1.0到4.0, 随着Linq,泛型的支持,代码越来越简单优雅 , , , , , , , , , }; IEnumerable< select n; newNums = newNu ...

  5. linux环境的基本搭建

    1.准备Linux环境(我的是centos系统) 如果你是hadoop用户在使用sudo之前需要配置一下:获取sudo权限 切换到root vi /etc/sudoersroot ALL=(ALL) ...

  6. springboot aop使用介绍

    第一步:添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  7. poj3260 平衡问题(二维01背包)

    http://www.cnblogs.com/ziyi--caolu/p/3228090.html http://blog.csdn.net/lyy289065406/article/details/ ...

  8. 申请微信小程序步骤

    一.注册 注册网址:https://mp.weixin.qq.com/ 选择账号类型:选择 小程序 注册账号 填写邮箱密码并激活:未注册过公众平台.开放平台.企业号.未绑定个人号的邮箱. 填写主体信息 ...

  9. Windows API-----top level window

    原文地址: http://blog.163.com/cumt_xl/blog/static/19071504420136911838683/ Q: What is a top-level window ...

  10. 数据结构----线性表顺序和链式结构的使用(c)

    PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写 ...