题目意思: 给定一个数n,假设有一个m ( 1<= m <= n),现在要求用二分查找的方法,问找到这个m的期望值是多少,期望值 = 总次数 / m的个数
解题思路: 直接枚举每一个可能的值,然后去二分查找,每次都把次数加起来,最后把总次数除以答案可能的个数即可
代码:
#include <algorithm> #include <iostream> #include <cstring> #include <string> #include <vector> #include <cstdio> #include <stack> #include <queue> #include <cmath> using namespace std; int n , sum , num; int Left , Right , Mid; //二分查找 void solve(){ sum = 0 ; for(int i = 1 ; i <= n ; i++){ Left = 1 ; Right = n ;//每次必须从新赋值 num = 0; while(1){ num++;//次数加一 Mid = (Left + Right)/2;//求出平均值 if(Mid == i){ sum += num ; break;//找到以后总次数加上num } if(Mid < i) Left = Mid+1; //如果平均值小于i,从新定义left 和right if(Mid > i) Right = Mid-1;//如果平均值大于i,从新定义left 和right } } } //主函数 int main(){ //freopen("input.txt" , "r" , stdin); while(scanf("%d" , &n) != EOF){ if(n == 1) printf("1.00\n");//n为1 比较特殊 else{ solve(); printf("%.2lf\n" , (sum*1.0)/n); } } return 0; }