1. 程式人生 > >BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飛車:貪心

BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飛車:貪心

有一個 駕車 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 奶牛飛車:貪心