Kattis - entertainmentbox
题目链接:https://vjudge.net/problem/Kattis-entertainmentbox
题目大意:
一种叫做不知道什么的盒子可以同时录 k 个节目,现给出 n 个节目的开始和结束时间,这个盒子最多能 “完整地” 录下多少个节目?
解题思路:
贪心。
训练的时候第一眼看见这道题就想起了《挑战》里面提到的 “区间调度问题”,乍看之下二者真的极为相似,但其实里面也有不同之处,但我的思维也被此局限住了。唉,弄了半天也弄不出个所以然,后来看了别人的题解才发现了自己哪里错了,真的好烦啊。感觉最近几天有点浮躁,要静下心来呀,骚年。
首先,将 n 个节目根据结束时间由早到晚排序这一点应该是很明确的,我们应该尽可能地选择早结束的,读者可以去翻阅一下《挑战程序设计竞赛》中的 “区间调度问题”。接下来的做法,我一开始是这么想的:弄一个队列,保存所有已经选取的节目的结束时间。一开始先让排序好的前 k 个结束时间入队。后来再让新节目入队的时候,如果它的开始时间晚于队首的结束时间,那么 pop 队首,让新节目的结束时间入队。后来想想自己真的是 too native. 随便一组数据就能推翻:
n=3,k=2.
1 10
2 5
6 9
后来又改变了几次思路,但通通不对,因为我没有抓住问题的本质,真的好燥啊!!!
其实这道题真正的贪心法则,应该是:每次选择是否要录制一个节目的时候,要从正在录制的队列中选择一个结束时间 “最接近” 我们正在考虑的节目的开始时间的节目,将这个节目从队列中 erase 掉,再把正在考虑的节目加进去。如果已有队列中所有节目的结束时间都在我们正考虑的节目的开始时间之后,那么如果已有队列中的节目小于 k,那么就直接把正在考虑的节目加入队列,否则的话就 continue.
实现方面,我是用 vector 和 upper_bound,一开始在 vector 中放入 k 个 0,代表没有节目正在录制。请看代码。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=;
typedef pair<int,int> P;
P rec[maxn];
bool cmp(const P &a,const P &b){
if(a.second==b.second) return a.first>b.first;
return a.second<b.second;
}
int main()
{
vector<int> que;
vector<int>::iterator iter;
int n,k;
scanf("%d%d",&n,&k);
for(int i=;i<n;i++) scanf("%d%d",&rec[i].first,&rec[i].second);
sort(rec,rec+n,cmp);
int ans=;
for(int i=;i<k;i++) que.push_back();
for(int i=;i<n;i++){
iter=upper_bound(que.begin(),que.end(),rec[i].first);
if(iter!=que.begin()){
que.erase(iter-);
que.push_back(rec[i].second);
ans++;
}
}
printf("%d\n",ans);
return ;
}
Kattis - entertainmentbox的更多相关文章
- Kattis - entertainmentbox 【贪心】
思路 先将 N 个 电视节目 排序 根据 结束时间 ,结束的早的 排在前面 然后 弄 K个标记 记录 结束时间 然后 遍历一下 每次 如果能插入的话 插入到 结束时间最小的那个 队列里面去然后 每次插 ...
- It's a Mod, Mod, Mod, Mod World Kattis - itsamodmodmodmodworld (等差数列求和取模)
题目链接: D - It's a Mod, Mod, Mod, Mod World Kattis - itsamodmodmodmodworld 具体的每个参数的代表什么直接看题面就好了. AC代码: ...
- A - Piece of Cake Kattis - pieceofcake (数学)
题目链接: A - Piece of Cake Kattis - pieceofcake 题目大意:给你一个多边形,然后给你这个多边形的每个点的坐标,让你从这个n个点中选出k个点,问这个k个点形成的面 ...
- Subsequences in Substrings Kattis - subsequencesinsubstrings (暴力)
题目链接: Subsequences in Substrings Kattis - subsequencesinsubstrings 题目大意:给你字符串s和t.然后让你在s的所有连续子串中,找出这些 ...
- G - Intersecting Rectangles Kattis - intersectingrectangles (扫描线)(判断多个矩形相交)
题目链接: G - Intersecting Rectangles Kattis - intersectingrectangles 题目大意:给你n个矩形,每一个矩形给你这个矩形的左下角的坐标和右上角 ...
- E - Emptying the Baltic Kattis - emptyingbaltic (dijkstra堆优化)
题目链接: E - Emptying the Baltic Kattis - emptyingbaltic 题目大意:n*m的地图, 每个格子有一个海拔高度, 当海拔<0的时候有水. 现在在(x ...
- G - Galactic Collegiate Programming Contest Kattis - gcpc (set使用)
题目链接: G - Galactic Collegiate Programming Contest Kattis - gcpc 题目大意:当前有n个人,一共有m次提交记录,每一次的提交包括两个数,st ...
- Kattis - virus【字符串】
Kattis - virus[字符串] 题意 有一个正常的DNA序列,然后被病毒破坏.病毒可以植入一段DNA序列,这段插入DNA序列是可以删除正常DNA序列中的一个连续片段的. 简单来说就是,给你一段 ...
- Kattis - bank 【简单DP】
Kattis - bank [简单DP] Description Oliver is a manager of a bank near KTH and wants to close soon. The ...
随机推荐
- Handler 机制(一)—— Handler的实现流程
由于Android采用的是单线程模式,开发者无法在子线程中更新 UI,所以系统给我提供了 Handler 这个类来实现 UI 更新问题.本贴主要说明 Handler 的工作流程. 1. Handler ...
- Linux分类
Linux versions:http://www.cnblogs.com/sammyliu/articles/4832157.html1. Maintained by organization- D ...
- Shiro(一):Shiro介绍及主要流程
什么是Shiro Apache Shiro是一个强大且灵活的开源安全框架,易于使用且好理解,撇开了搭建安全框架时的复杂性. Shiro可以帮助我们做以下几件事: 认证使用者的身份 提供用户的访问控制, ...
- Linux 下如何产生core文件(core dump设置)
转自:https://blog.csdn.net/star_xiong/article/details/43529637 今天在Linux下调试C程序时,出现段错误,习惯性的ls下当前目录,发现没有生 ...
- Linux下创建软、硬链接
在linux系统中,内核为每一个新创建的文件分配一个Inode(索引节点),每个文件都有唯一的inode号.文件属性保存在索引节点里,在访问文件时,索引节点被复制到内存,从而实现文件的快速访问. 链接 ...
- 上传组件Fine Uploader在ASP.NET中的应用
现如今,世面上流行着许多前端上传组件,例如:Uploadify(http://www.uploadify.com/),Fine Uploader,等等.这篇博客从头开始,介绍如何在ASP.NET MV ...
- Java——集合系列(1)框架概述
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...
- B - Save the problem! CodeForces - 867B 构造题
B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...
- TransactionHelper
public class TransactionHelper { public static OracleTransaction ora_Transaction = null; public stat ...
- 系统通配符号、系统正则符号,grep
系统通配符号.系统正则符号,grep 1 系统通配符号 系统通配符号:借助通配符号 匹配文件名称信息 1.1 *: 匹配所有(任意)字符信息 找寻以old开头的文件 find /oldboy -typ ...