不是很容易写出正解的贪心问题。

题目描述

Although Farmer John has no problems walking around the fair to collect prizes or see the shows, his cows are not in such good shape; a full day of walking around the fair leaves them exhausted. To help them enjoy the fair, FJ has arranged for a shuttle truck to take the cows from place to place in the fairgrounds.

FJ couldn't afford a really great shuttle, so the shuttle he rented traverses its route only once (!) and makes N (1 <= N <= 20,000) stops (conveniently numbered 1..N) along its path. A total of K (1 <= K <= 50,000) groups of cows conveniently numbered 1..K wish to use the shuttle, each of the M_i (1 <= M_i <= N) cows in group i wanting to ride from one stop S_i (1 <= S_i < E_i) to another stop E_i (S_i < E_i <= N) farther along the route.

The shuttle might not be able to pick up an entire group of cows (since it has limited capacity) but can pick up partial groups as appropriate.

Given the capacity C (1 <= C <= 100) of the shuttle truck and the descriptions of the groups of cows that want to visit various sites at the fair, determine the maximum number of cows that can ride the shuttle during the fair.

逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的。所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车代步。但是,约翰木有钱,他租来的班车只能在集市上沿直线跑一次,而且只能停靠\(N(1≤N≤20000)\)个地点(所有地点都以1到N之间的一个数字来表示)。现在奶牛们分成\(K(1≤K≤50000)\)个小组,第\(i\)组有\(M_i(1≤M_i≤N)\)头奶牛,他们希望从\(S_i\)跑到\(T_i(1\le S_i<T_i≤N)\)。

由于班车容量有限,可能载不下所有想乘车的奶牛们,此时也允许小里的一部分奶牛分开乘坐班车。约翰经过调查得知班车的容量是\(C(1≤C≤100)\),请你帮助约翰计划一个尽可能满足更多奶牛愿望的方案。

输入输出格式

输入格式:

第一行:包括三个整数:\(K,N\)和\(C\),彼此用空格隔开。

第二行到\(K+1\)行:在第\(i+1\)行,将会告诉你第i组奶牛的信息:\(S_i,E_i\)和\(Mi\),彼此用空格隔开。

输出格式:

第一行:可以坐班车的奶牛的最大头数。

输入输出样例

输入样例#1:

8 15 3
1 5 2
13 14 1
5 8 3
8 14 2
14 15 1
9 12 1
12 15 2
4 6 1
输出样例#1:

10

说明

【样例说明】

班车可以把2头奶牛从1送到5,3头奶牛从5送到8,2头奶牛从8送到14,1头奶牛从9送到12,1头奶牛从13送到14,1头奶牛从14送到15。

题解:

    贪心问题。因为结束时间较早的奶牛可以给后面的奶牛预留更多的空间,所以我们要按结束时间早为第一关键字,开始时间早为第二关键字对每组奶牛排序。

    当然,如果只有1个座位的话直接按顺序插空。但是现在有\(c\)个座位了,会出现一些反例,也就是不能像排队接水那样先接在最早留空的后面。

    对于每组奶牛,我们要选择上一次下车位置最接近下一次起点的座位接上去,因为这样满足了贪心,而且如果有上一次下车位置离下一次起点稍微远一点的座位,它可以创造更大的价值。下面是一个例子:

    按照顺序,奶牛1会排在前面。如果奶牛1抢了座位1,那么奶牛2就坐不进去了。而奶牛1的时间实际上是可以坐进座位2的,这样给空位更大的座位1留下了创造更大价值的机会。由此可以知道,奶牛要去接在结束时间最早且在自己开始之前结束的那个座位上。因为\(c\)比较小,所以可以每次都排序,如果\(c\)太大的话需要借助线段树来辅助其他算法降低复杂度。

    同时,我们是一组一组排序的,而当前总比后面的优,所以如果上图奶牛1不止1头,就可以去抢占座位1啦。统计时记得把奶牛1的数量减少,保证当前奶牛数量不为0;不然就要操作下一组奶牛了。

Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
struct act
{
int s,t,num;
friend bool operator <(act a,act b)
{
if(a.t!=b.t)
return a.t<b.t;
return a.s<b.s;
}
}a[50010];
int End[111];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int k,n,c;
scanf("%d%d%d",&k,&n,&c);
for(int i=1;i<=k;++i)
scanf("%d%d%d",&a[i].s,&a[i].t,&a[i].num);
std::sort(a+1,a+1+k);
int sum=0;
for(int i=1;i<=k;++i)
{
std::sort(End+1,End+1+c,cmp);
for(int j=1;a[i].num&&j<=c;++j)
if(End[j]<=a[i].s)
{
++sum;
End[j]=a[i].t;
a[i].num--;
}
}
printf("%d\n",sum);
return 0;
}

  

【贪心】洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle 题解的更多相关文章

  1. 洛谷 P1607 [USACO09FEB]庙会班车Fair Shuttle 解题报告

    P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...

  2. 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle

    P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...

  3. P1607 [USACO09FEB]庙会班车Fair Shuttle

    题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the shows ...

  4. [USACO09FEB]庙会班车Fair Shuttle 线段树维护maxx&&贪心

    题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the shows ...

  5. 线段树【p1607】[USACO09FEB]庙会班车Fair Shuttle

    Description 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼--如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛 ...

  6. [USACO09FEB]庙会班车Fair Shuttle

    题目描述 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车 ...

  7. 【USACO09FEB】 庙会班车 Fair Shuttle 贪心+线段树

    Although Farmer John has no problems walking around the fair to collect prizes or see the shows, his ...

  8. 【Luogu】P1607庙会班车Fair Shuttle(线段树+贪心)

    我不会做贪心题啊……贪心题啊……题啊……啊…… 我真TM菜爆了啊…… 这题就像凌乱的yyy一样,把终点排序,终点相同的按起点排序.然后维护一个查询最大值的线段树.对于一个区间[l,r],如果这个区间已 ...

  9. 洛谷 P2939 [USACO09FEB]改造路Revamping Trails 题解

    P2939 [USACO09FEB]改造路Revamping Trails 题目描述 Farmer John dutifully checks on the cows every day. He tr ...

随机推荐

  1. Luogu 4721 【模板】分治 FFT

    还不会这题的多项式求逆的算法. 发现每一项都是一个卷积的形式,那么我们可以使用$NTT$来加速,直接做是$O(n^2logn)$的,我们考虑如何加速转移. 可以采用$cdq$分治的思想,对于区间$[l ...

  2. 现代C++学习笔记之二入门篇1

    现代 C++ 强调: 基于堆栈的范围,而非堆或静态全局范围. 自动类型推理,而非显式类型名称. 智能指针而不是原始指针. std::string 和 std::wstring 类型(请参见 <s ...

  3. HDU 4430 Yukari's Birthday (二分)

    题意:有 n 个蜡烛,让你插到蛋糕上,每一层要插 k^i个根,第0层可插可不插,插的层数是r,让 r * k 尽量小,再让 r 尽量小,求r 和 k. 析:首先先列出方程来,一个是不插的一个是插的,比 ...

  4. (转)XSS危害——session劫持

    原文地址:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的 ...

  5. 日期多选插件Kalendae.js

    在项目中要实现日期多选的功能,于是在网上找到Kalendae.js,此文主要记录本人对于Kalendae.js的一些用法,以便以后查阅,希望对读者也有所帮助 主要内容如下: Kalendaejs一句话 ...

  6. OM Responsibility Flow

  7. vs2010 does not have a strong name

    处理步骤: C:\myWorkSpace\IECG Dev. Tool\Forklift\DbUpgraderDLL\bin\Debug 为dll 所在目录 DbUpgraderDLL.dll为dll ...

  8. 关于PHP中的Trait

    今天看PHP框架,看到Trait部分.没见过,好奇查了一下. PHP手册说的是解决多继承的问题.但是一般面向对象的语言中,解决多继承都是通过接口,PHP也有接口.貌似看上去Trait和Interfac ...

  9. go的Type switch是一个switch语句么?

    相信这样的语句在go中大家见的很多 switch t := arg.(type) { default: fmt.Printf("unexpected type %T\n", t) ...

  10. iOS开发系统类功能划分

    0.OC语法基础 CHOCBase Object C语法学习笔记(一) Object C语法学习笔记(二) 1.UI类 自定义控件程序运行流程 setNeedsLayOut和setNeedsDispl ...