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 }
时间: 2024-11-08 21:01:08

BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飞车:贪心的相关文章

bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车

1623: [Usaco2008 Open]Cow Cars 奶牛飞车 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 325  Solved: 223[Submit][Status][Discuss] Description 编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000). 在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生

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

1623: [Usaco2008 Open]Cow Cars 奶牛飞车 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 291  Solved: 201[Submit][Status][Discuss] Description 编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000). 在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生

【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心

SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 int v[50010]; 6 int n,m,d,l,ans; 7 int main() 8 { 9 scanf("%d%d%d%d",&n,&

bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set

Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个"群".每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤[1..10^9]:Xi,Yi∈整数.当满足下列两个条件之一,两只奶牛i和j是属于同一个群的: 1.两只奶牛的曼哈顿距离不超过C(1≤C≤10^9),即lXi - xil+IYi - Yil≤C. 2.两只奶牛有共同的邻居.即,存在一只奶牛k,使i与k,j与k均同属一个群.

BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap

题意:链接 方法: Treap 解析: 前几道资格赛的题水的不行,这道Gold的题就够分量辣. 首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发现这个玩意转化之后就变得有思路多了,所以这数学本领还是很重要啊=-= 先看曼哈顿距离的定义 |x1?x2|+|y1?y2| 拆绝对值 x1?x2+y1?y2或x1?x2+y2?y1 x2?x1+y1?y2或x2?x1+y2?y1 即|x1+y1?(x2+y2)|或|x1?y1?(x2?y2)| 设x

bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树

大致题意:统计平面上由曼哈顿距离小于等于c的点对组成联通块的个数. 曼哈顿生成树的模板题.有关讲解:http://blog.csdn.net/acm_cxlove/article/details/8890003 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define MAXN 100100 #define MA

bzoj1604[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居*

bzoj1604[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 题意: n只牛,牛结成群当且仅当两只牛曼哈顿距离≤c或存在第三头牛使两头牛与它的曼哈顿距离都≤c,求最大的群和群数.n≤100000 题解: 好神啊.先把曼哈顿距离转成切比雪夫距离,(x,y)转为(x+y,x-y).然后按x坐标排序,用两个指针维护使x坐标差值≤c,同时将新插入的y坐标放入set,每次在set里查找出与当前y差值不超过c的最大y,将这两个点合并成一个集合,用并查集维护. 代码: 1 #

[BZOJ] 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛

1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1312  Solved: 736[Submit][Status][Discuss] Description 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T

BZOJ 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛( dp )

一道水 dp ...然后我一开始用 BFS ...结果 MLE 了... dp[ i ][ j ][ k ] 由它四个方向上的 k - 1 转移. ----------------------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<