Interviewe |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 473 Accepted Submission(s): 119 |
Problem Description
YaoYao has a company and he wants to employ m people recently. Since his company is so famous, there are n people coming for the interview. However, YaoYao is so busy that he has no time to interview them by himself. So he decides to select exact m interviewers for this task. YaoYao decides to make the interview as follows. First he queues the interviewees according to their coming order. Then he cuts the queue into m segments. The length of each segment is
![]() |
Input
The input consists of multiple cases. In the first line of each case, there are two numbers n and k, indicating the number of the original people and the sum of the ability values of employees YaoYao wants to hire (n≤200000, k≤1000000000). In the second line, there are n numbers v1, v2, …, vn (each number is between 0 and 1000), indicating the ability value of each arrived interviewee respectively. The input ends up with two negative numbers, which should not be processed as a case.
|
Output
For each test case, print only one number indicating the smallest m you can find. If you can’t find any, output -1 instead.
|
Sample Input
11 300 7 100 7 101 100 100 9 100 100 110 110 -1 -1 |
Sample Output
3 Hint
We need 3 interviewers to help YaoYao. The first one interviews people from 1 to 3, the second interviews people from 4 to 6, and the third interviews people from 7 to 9. And the people left will be ignored. And the total value you can get is 100+101+100=301>300. |
Source
2010 ACM-ICPC Multi-University Training Contest(5)——Host by BJTU
|
Recommend
zhengfeng
|
分析:RMQ问题,枚举分组数,将每组的最大值求和。枚举时要判断组长是否和上一次分组相同,节省时间。PS:二分是错误的,因为非单调。
#include<cstdio> #include<cstring> #include<cmath> int n; int d[200010][20]; inline int max(int a, int b) { return a > b ? a : b; } void st() { int m, i, j; m = (int) (log((double) n) / log(2.0)); for (j = 1; j <= m; ++j) { for (i = 1; i + (1 << j) - 1 <= n; ++i) d[i][j] = max(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]); } } int rmq(int a, int b) { int m = (int) (log(b - a + 1.0) / log(2.0)); return max(d[a][m], d[b - (1 << m) + 1][m]); } int main() { int i, a, b, len, pre, temp, k,m; long long ans; while (scanf("%d%d", &n, &k) != EOF && n >= 0) { for (i = 1; i <= n; ++i) { scanf("%d", &d[i][0]); } st(); pre = -1; for (i = 1; i <= n; ++i) { len = n / i; m = len*i; if (len != pre) { a = 1; b = len; ans = 0; } else { a = temp + 1; b = temp + len; } while (b <= m) { ans += rmq(a, b); a += len; b += len; } if (ans > k) break; pre = len; temp=m; } if (i > n) printf("-1\n"); else printf("%d\n", i); } return 0; }