[USACO17JAN]Cow Dance Show S
这道题目是二分舞台大小,为什么能用二分呢?因为如果mid成立 则mid~r都成立,如果mid不成立l~mid就都不成立,也就是严格单调,所以可以使用二分快速找到k。
check函数的思路:
实现:在舞台为k的情况下表演时间能否满足tmax。
思路:1.先给舞台上放k头牛按表演时间排序
2.然后将余下的k+1~n在第一头牛的位置依次上舞台,每次上舞台后重新排序。
3.最后第k头牛就是总耗时,判断是否满足tmax即可。
程序:
1 #include2 using namespace std; 3 int n,tmax,d[10010]={0}; 4 int check(int k) 5 { 6 int w[10010]={0}; 7 for(int i=1;i<=k;i++) w[i]=d[i]; 8 sort(w+1,w+1+k); 9 for(int i=k+1;i<=n;i++) 10 { 11 w[1]+=d[i]; 12 sort(w+1,w+1+k); 13 } 14 if(w[k]>tmax) return 0; 15 else return 1; 16 } 17 int main() 18 { 19 cin>>n>>tmax; 20 for(int i=1;i<=n;i++) cin>>d[i]; 21 int l=1,r=n; 22 while(l+1!=r) 23 { 24 int mid=(l+r)/2; 25 if(check(mid)) 26 { 27 r=mid; 28 } 29 else l=mid; 30 } 31 cout< endl; 32 return 0; 33 }