[ 题解 ] [ 二分+模拟 ] E. Convention
Posted kaidora
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ 题解 ] [ 二分+模拟 ] E. Convention相关的知识,希望对你有一定的参考价值。
http://codeforces.com/group/NVaJtLaLjS/contest/238203/problem/E
题意:
农夫的N只牛会在N[i]时间到达机场,农夫准备了M辆大巴去接。每辆大巴能载C只牛。(MC≥N)
问对于一只牛最小的最长等待时间是多少。
示例:
Input:
6 3 2 1 1 10 14 4 3
Output:
4
你要明确这里要搜索什么。既然题目问的是等待时间,我们就搜索这个等待时间;不要想着怎样给这N个数据套M个区间,太复杂了。
搜索用二分,109不是开玩笑的,至少暴力是不可能的;
那二分的判断条件呢?
首先得明白搜索这个最长等待时间有什么用。对于第一只上车的牛,它的等待时间是最后一只上车的牛与它的到达时间差;
与第一只牛的时间差大于这个最大等待时间,那么这头牛就得去坐下一辆车了。
还有车坐满了也只能去下一辆坐。
通过上面算出来需要多少车,如果车不够,二分就得提高下限;车够用,降低上限。
二分结束后不要忘记+1。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int compare(const void *p1,const void *p2) 5 { 6 return *(int*)p1 - *(int*)p2 ; 7 } 8 9 int N,M,C; 10 int cows[100002]={0}; 11 12 int check(int mid) 13 { 14 int count=1,last=0; 15 for(int n=0;n<N;n++) 16 { 17 if( n-last >= C || cows[n]-cows[last] > mid ) 18 { 19 count++; 20 last=n; 21 } 22 } 23 if(M>=count)return 1; 24 else return 0; 25 } 26 27 int main() 28 { 29 scanf("%d%d%d",&N,&M,&C); 30 for(int n=0;n<N;n++) 31 scanf("%d",cows+n); 32 33 qsort(cows,N,sizeof(int),compare); 34 35 int left=0,right=cows[N-1]-cows[0],mid=0; 36 while(left<=right) 37 { 38 // printf("mid=%d ",mid); 39 mid=(left+right)/2; 40 if(check(mid))right=mid-1; 41 else left=mid+1; 42 } 43 printf("%d ",right+1); 44 return 0; 45 }
!-- @page>!-- @page>!-- @page>
以上是关于[ 题解 ] [ 二分+模拟 ] E. Convention的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function(预处理+二分)
Codeforces Round #344 (Div. 2) E. Product Sum 二分斜率优化DP