BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飞车:贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1623
题意:
编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰。高速公路有M(1≤M≤N)条车道。奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000)。
在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生。
每条车道上,如果某一只奶牛i的前面有K只奶牛驾车行驶,那奶牛i的速度上限就会下降K*D个单位,也就是说,她的速度不会超过Si - k*D(O≤D≤5000),当然如果这个数是负的,那她的速度将是0。
牛德比亚的高速会路法规定,在高速公路上行驶的车辆时速不得低于L(1 ≤ L ≤ 1,000,000)。
那么,请你计算有多少奶牛可以在高速公路上行驶呢?
题解:
贪心。
先按s[i]从小到大排序。
s[i]越大的牛,能够承受的前面牛的数量越大,应该排在后面。
所以将s[i]小的排在前面(一行一行排)。
当前限速为 spd = s[i] - (ans/m)*d (前面牛数量 = 当前行数 = ans/m)
如果满足 spd >= L,则当前牛可以添加,ans++。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 #define MAX_N 50005 6 7 using namespace std; 8 9 int n,m,d,l; 10 int ans=0; 11 int s[MAX_N]; 12 13 void read() 14 { 15 cin>>n>>m>>d>>l; 16 for(int i=0;i<n;i++) 17 { 18 cin>>s[i]; 19 } 20 } 21 22 void solve() 23 { 24 sort(s,s+n); 25 for(int i=0;i<n;i++) 26 { 27 int spd=s[i]-(ans/m)*d; 28 if(spd>=l) ans++; 29 } 30 } 31 32 void print() 33 { 34 cout<<ans<<endl; 35 } 36 37 int main() 38 { 39 read(); 40 solve(); 41 print(); 42 }