hdu 3484 Interviewe RMQ+二分

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn = 200000 + 5;
 6 int a[maxn];
 7 int maxsum[maxn][30];
 8 int n, k;
 9 
10 void RMQ(int num){
11     for (int i = 1; i <= num; i++){
12         maxsum[i][0] = a[i];
13     }
14 
15     for (int j = 1; j < 30; j++){
16         for (int i = 1; i <= num; i++){
17             if (i + (1 << j) - 1 <= num){
18                 maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]);
19             }
20         }
21     }
22     return;
23 }
24 
25 //获取[x,y]的最大值
26 int getmax(int x, int y){
27     int k1 = (int)(log((double)(y - x + 1)) / log(2.0));
28     return max(maxsum[x][k1], maxsum[y - (1 << k1) + 1][k1]);
29 }
30 
31 //获取m人的最大值(m组)
32 int Find(int m){
33     int ans = 0;
34     int num = n / m;//每组num个人
35     for (int i = 0; i < m; i++){
36         ans += getmax(1 + i*num, (i + 1)*num);
37         if (ans > k)
38             return ans;
39     }
40     return ans;
41 }
42 
43 int main(){
44     while (~scanf("%d%d", &n, &k)){
45         if (n == -1 && k == -1)
46             break;
47         int sum = 0;
48         bool ok_1 = false;
49         for (int i = 1; i <= n; i++){
50             scanf("%d", &a[i]);
51             if (a[i] > k){
52                 ok_1 = true;
53             }
54             sum += a[i];
55         }
56         if (ok_1){
57             printf("1\n");
58             continue;
59         }
60         if (sum < k){
61             printf("-1\n");
62             continue;
63         }
64         if (sum == k){
65             printf("%d\n", k);
66             continue;
67         }
68         //初始化
69         RMQ(n);
70         bool ok = false;
71         int l = 1;
72         int r = n;
73         int ans = 0;
74         int mid, t;
75         while (l <= r){
76             mid = (l + r) / 2;
77             t = Find(mid);
78             if (t > k){
79                 r = mid - 1;
80                 ans = mid;
81                 ok = true;
82             }
83             else{
84                 l = mid + 1;
85             }
86         }
87         if (ok)
88             printf("%d\n", ans);
89         else
90             printf("-1\n");
91     }
92     //system("pause");
93     return 0;
94 }

 

posted @ 2017-11-16 21:06  ouyang_wsgwz  阅读(117)  评论(0编辑  收藏  举报