AOJ 615学会缜密思考 神算诸葛亮
来源:互联网 发布:消防知识知多少 200字 编辑:程序博客网 时间:2024/04/30 16:22
相传有一天,诸葛亮把将士们召集在一起,说:“你们中间不论谁,从1~1024中任意挑选一个整数,记在心里,我提十个问题,只要求回答’是’或’大于’,’小于’.十个问题全答完以后,我 就会‘算’出你心里记的那个数。”诸葛亮刚说完,一个谋士站起来说,他已经选好了一个数。诸葛亮问道:“你选的数大于512?”谋士答:“不是。”诸葛亮又接连向这,谋士提了九个问题,谋士一一作了回答。诸葛亮最后说:“你记的那个数是1。”谋士听了极为惊奇,因为这个数字真是他选的数。你知道诸葛亮是怎么妙算的吗?现在给你一个整数N,表示你要猜一个范围为【1,N】的数字(这个数字已经提前确定了),你知道最坏情况下猜几次才能确定答案吗?
输入包括多组数据,以文件(EOF)结束。
每组测试数据包括一个整数N(1<= N <= 10 ^ 9)
每组测试数据输出一个整数,表示最多猜几次才能确定答案。
对于这样的问题,其实可以抽象为一个很简单的问题,但实现的方法很多,最为关键的是要用逻辑思维去判断自己的思考是否正确,这才是超越题目本身最为重要的。
直觉告诉我,如果提出需要猜出的数字为1,那么这肯定是一个最难猜出的,事实上,这也是正确的。现在就需要逆向考虑,从1一直到最大范围,需要猜测多少次,我们知道,这一定是1 2 4 8 16 32 64 128……
这样的序列继续下去,如果这个最大的界限恰好在pow(2,n)上的话,比如说64,那我们就需要猜64, 32,16,8,4,2(注意是最大情况,64一开始就要猜一下而不是从32开始)这6次就能得出正确答案了,但是问题是如果这个界限值是65,67,68呢?只要不小于128,就和64的情况是一样的,这个我们可以自己比划。所以,代码如下
#include<iostream>using namespace std;int main(){ long long int n,temp; int i; while(cin>>n){ if(n==1){ //1的情况不需要计算 cout<<0<<endl; continue; } i=0; temp=1; while((temp*=2)<=n) i++; cout<<i<<endl; } return 0;}
- AOJ 615学会缜密思考 神算诸葛亮
- AOJ615 神算诸葛亮
- 诸葛亮神算 v5.0 是什么
- 学会思考
- 学会思考
- 学会思考
- 学会倾听 学会思考
- 学会思考,学会总结
- 诸葛亮
- 学会换位思考
- 学会思考1
- 学会思考2
- 回归博客 学会思考
- 学会思考程序
- AOJ
- Aoj
- 学会思考,学会使用帮助工具
- 学会思考,学会使用帮助工具
- ZOJ 1003 Crashing Ballon
- 促销#卡券系统整理
- [Android][KK][SMS]Frameworks学习——其他相关类
- arm_day11
- 使用hint改变SQL执行计划的方法
- AOJ 615学会缜密思考 神算诸葛亮
- 蓝桥杯 ALGO-102 数对(数学)
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!
- 银行业务调度系统
- UCOS移植第一篇:os_cpu.c
- 基于rt-thread+lwip分析数据是怎么从网卡芯片接收数据到pbuf的(lwip源码解析一)
- ios 开发中跟绘图相关的CGFloat,CGPoint,CGSize,CGRect,CGRectZero
- C#-delegate
- 对Jscript操作注册表接口的一点不解