有一个 驾车 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:
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- #define MAX_N 50005
- using namespace std;
- int n,m,d,l;
- int ans=0;
- int s[MAX_N];
- void read()
- {
- cin>>n>>m>>d>>l;
- for(int i=0;i<n;i++)
- {
- cin>>s[i];
- }
- }
- void solve()
- {
- sort(s,s+n);
- for(int i=0;i<n;i++)
- {
- int spd=s[i]-(ans/m)*d;
- if(spd>=l) ans++;
- }
- }
- void print()
- {
- cout<<ans<<endl;
- }
- int main()
- {
- read();
- solve();
- print();
- }
BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飞车:贪心
来源: http://www.bubuko.com/infodetail-2331768.html