三、阅读程序-2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <algorithm>
#include <cstdio>
#include <cstring>
#define ll long long

int cnt_broken = 0;   
int cnt_check = 0;    
int n, k;            

inline bool check(int h) {
    printf("now check:%d\n", h);
    ++cnt_check;
    if (cnt_broken == 2) {  
        printf("You have no egg!\n");
        return false;
    }
    if (h >= k) {
        ++cnt_broken;
        return true;
    } else {
        return false;
    }
}

inline bool assert_ans(int h) {
    if (h == k) {
        printf("You are Right using %d checks\n", cnt_check);
        return true;
    } else {
     //   printf("Wrong answer!\n");
        return false;
    }
}
//method 1
inline void guess1(int n) {
    for (int i = 1; i <= n; ++i) {
        if (check(i)) {
            assert_ans(i);
            return;
        }
    }
}

inline void guess2(int n) {
    int w = 0;
    for (w = 1; w * (w + 1) / 2 < n; ++w);
    
    
    for (int ti = w,nh=w;; --ti, nh += ti,nh=std::min(nh,n)) {
         if(nh==k){
            printf("now check:%d\n", nh);
            cnt_check++;
            assert_ans( nh);
            return ;
         }
         if (check(nh)) {
            for (int j = nh-ti+ 1; j < nh; ++j) {
                if (check(j)) {
                    assert_ans(j);
                    return;
                }
            }
            
            assert_ans(nh);
            return;
        }
    }
 
}

(注意:下述的“猜测数”为调用 check 函数的次数(即 cnt_check 的值);“猜测正确”的含义为 assert_ans 函数 return true(执行第 25 行所在分支)的情况;所有输入保证 1≤k≤n。)