三、阅读程序-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。)
