BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飞车:贪心

Posted Leohh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飞车:贪心的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飞车:贪心

BZOJ_1623:_[Usaco2008_Open]_Cow_Cars_奶牛飞车_(贪心)

bzoj1622[Usaco2008 Open]Word Power 名字的能量*

[BZOJ] 1621: [Usaco2008 Open]Roads Around The Farm分岔路口

BZOJ 1624 Usaco2008 Open Clear And Present Danger 寻宝之路

[BZOJ1624][Usaco2008 Open] Clear And Present Danger 寻宝之路