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