[ 题解 ] [ 二分+模拟 ] 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\n",mid);
39         mid=(left+right)/2;
40         if(check(mid))right=mid-1;
41         else left=mid+1;
42     }
43     printf("%d\n",right+1);
44     return 0;
45 }

猜你喜欢

转载自www.cnblogs.com/Kaidora/p/10534661.html