BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飛車:貪心
阿新 • • 發佈:2017-09-30
有一個 駕車 zoj bzoj pan fin 就會 std 前行
題目鏈接: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 }
BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飛車:貪心