zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    44.分治算法练习:  一元三次方程求解
    44.分治算法练习:  一元三次方程求解
    44.分治算法练习:  一元三次方程求解
    MVC-04 视图(1)
    MVC-03 控制器(5)
    MVC-03 控制器(4)
    MVC-03 控制器(3)
    MVC-03 控制器(2)
    MVC-03 控制器(1)
    MVC-02 路由
  • 原文地址:https://www.cnblogs.com/Leohh/p/7613024.html
Copyright © 2011-2022 走看看