A有1数m,B来猜.B每猜一次,A就说"太大","太小"或"对了" 。 <br>问B猜n次可以猜到的最大数。 <br>
Input
第1行是整数T,表示有T组数据,下面有T行 <br>每行一个整数n (1 ≤ n ≤ 30) <br>
Output
猜n次可以猜到的最大数<br>
Sample Input
2<br>1<br>3
Sample Output
1<br>7<br>
Author
Zhousc
Source
ECJTU 2008 Summer Contest
题目大意:
如题。
思路:
假设 n 为 3. 那么是这样的。
第一次猜 4 结果有两种 , 太大 ,太小
如果太大的话 下一次可以猜 2
如果太小的话 下一次可以猜 6
第二次猜 2 的话结果有两种 太大 (第三次 1 ) 或者 太小 ( 第三次 3 )
第二次猜 6 的话结果有两种 太大 (第三次 5 ) 或者 太小 ( 第三次 7 )
这样的话就形成了一个树结构。
4
/ \
2 6
/ \ / \
1 3 5 7
这样就把所有的数字遍历一次啦。
另一个样例数据:
1
|
1
猜的时候不能漏下数字呀,对不对?!?如果任意猜的话那么数据无限大就没意思了。
其实这个排完序来看的话,就是一个二叉树结构。
对于二叉树结构来看的话。最大的数就是 2^D-1 D为深度。
感想:
呼呼,感觉还是挺难的,还不太理解吧可能。刚才忘了把读入外部文件的那句话 注释掉 出现了一个奇怪的错误。
AC代码:
#include <cstdio>
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<numeric>
#include<math.h>
#include<string.h>
#include<map>
#include<set>
#include<vector>
#include<iomanip>
using namespace std;
int main()
{
//freopen("r.txt","r",stdin);
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
n=pow(2,n)-1;
cout<<n<<endl;
}
}