二分查找 2015百度之星初赛1 HDOJ 5246 超级赛亚ACMer

题目传送门

 1 /*
 2     二分找到不大于m的最大的数,记做p,只要a[p] + k <= a[p+1]就继续
 3     注意:特判一下当没有比m小的数的情况:)
 4 */
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <cmath>
 8 #include <algorithm>
 9 using namespace std;
10 
11 typedef long long ll;
12 
13 const int MAXN = 1e4 + 10;
14 const int INF = 0x3f3f3f3f;
15 ll a[MAXN];
16 
17 int main(void)        //2015百度之星初赛1 1001 超级赛亚ACMer
18 {
19     int n, m, k;
20     int t, cas = 0;
21     scanf ("%d", &t);
22     while (t--)
23     {
24         scanf ("%d%d%d", &n, &m, &k);
25         for (int i=1; i<=n; ++i)    scanf ("%I64d", &a[i]);
26         sort (a+1, a+1+n);
27 
28         int p = lower_bound (a+1, a+1+n, m) - a - 1;
29 //        printf ("here %d
", p);
30         bool flag = true;
31         while (p + 1 <= n && a[p] + k >= a[p+1])
32         {
33             p++;
34             if (k > 0)    k--;
35         }
36         if (p < n)    flag = false;
37 //        printf ("here %d
", p);
38 
39         printf ("Case #%d:
", ++cas);
40         if (m < a[1])    puts ("madan!");
41         else if (!flag)    puts ("madan!");
42         else    puts ("why am I so diao?");
43     }
44 
45     return 0;
46 }
47 
48 /*
49 2
50 5 11 3
51 15 13 10 9 8
52 5 11 3
53 8 9 10 13 16
54 */
编译人生,运行世界!
原文地址:https://www.cnblogs.com/Running-Time/p/4541588.html