bzoj1623[Usaco2008 Open]Cow Cars 奶牛飞车*

bzoj1623[Usaco2008 Open]Cow Cars 奶牛飞车

题意:

n头奶牛开车,第i头速度上限为si,高速上有m个车道,如果在一头奶牛前面有d头奶牛位于它所在车道,这头奶牛的实际速度为si-k*d,高速最低速度为l,求一共可以让多少头奶牛上高速。n,m≤50000

题解:

先让所有奶牛按速度上限排序,然后依次选取:求出当前奶牛前面最多可以有多少头奶牛x,然后二分求出m条车道中当前奶牛数小于等于x且最大的那条车道,把这头奶牛放入这个车道;如果没位置可放或这头奶牛速度上限小于l,就将它弃置。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 50100
 5 #define inc(i,j,k) for(int i=j;i<=k;i++)
 6 using namespace std;
 7 
 8 inline int read(){
 9     char ch=getchar(); int f=1,x=0;
10     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
11     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
12     return f*x;
13 }
14 int n,m,d,l,a[maxn],b[maxn],ans;
15 int find(int x){
16     int l=1,r=m,ans=-1;
17     while(l<=r){int mid=(l+r)>>1; if(x>=b[mid])ans=mid,r=mid-1;else l=mid+1;}
18     return ans;
19 }
20 int main(){
21     n=read(); m=read(); d=read(); l=read(); inc(i,1,n)a[i]=read(); sort(a+1,a+1+n);
22     inc(i,1,n){
23         if(a[i]<l)continue; int c=(a[i]-l)/d,e=find(c); if(e==-1)continue;else b[e]++,ans++;
24     }
25     printf("%d",ans); return 0;
26 }

 

20160801

posted @ 2016-08-03 13:16  YuanZiming  阅读(256)  评论(0编辑  收藏  举报