Interviewe |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 945 Accepted Submission(s): 234 |
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 |
Input The input consists of multiple cases. |
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 |
/* 一道一道有毒的题,忘了一种竟然可以n个线段 */ #include<bits/stdc++.h> using namespace std; int d[200100][20]; int n,k,cur,ob,maxn; void init() { for (int j = 1; (1 << j) < n; j++){ int t = (1 << j) - 1; for (int i = 0; i+t < n; i++){ d[i][j] = max(d[i][j-1], d[i+(1<<(j-1))][j-1]); } } } inline int RMQ(int a, int b) { int l = int(log(double(b-a+1))/log(2.0)); return max(d[a][l], d[b+1-(1<<l)][l]); } int main() { //freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin); while(scanf("%d%d",&n,&k)&&n>=0&&k>=0) { ob=0; maxn=0; for(int i=0;i<n;i++) { scanf("%d",&d[i][0]); ob+=d[i][0]; maxn=max(maxn,d[i][0]); } if(ob<=k) { puts("-1"); continue; } init();//RMQ预处理 /*二分找最小值*/ int ans=n; for(int m=max(1,k/maxn);m<n;m++) { cur=0; int t=n/m;//分组的长度 //cout<<"t="<<t<<endl; for(int i=1;i<=m;i++)//枚举的组数 { cur+=RMQ(t*(i-1),t*i-1); //cout<<t*(i-1)+1<<" "<<t*i<<endl; if(cur>k) break; } if(cur>k) { ans=m; break; } } printf("%d\n",ans); } return 0; }