题目链接: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的更多相关文章

  1. Kattis - entertainmentbox 【贪心】

    思路 先将 N 个 电视节目 排序 根据 结束时间 ,结束的早的 排在前面 然后 弄 K个标记 记录 结束时间 然后 遍历一下 每次 如果能插入的话 插入到 结束时间最小的那个 队列里面去然后 每次插 ...

  2. It's a Mod, Mod, Mod, Mod World Kattis - itsamodmodmodmodworld (等差数列求和取模)

    题目链接: D - It's a Mod, Mod, Mod, Mod World Kattis - itsamodmodmodmodworld 具体的每个参数的代表什么直接看题面就好了. AC代码: ...

  3. A - Piece of Cake Kattis - pieceofcake (数学)

    题目链接: A - Piece of Cake Kattis - pieceofcake 题目大意:给你一个多边形,然后给你这个多边形的每个点的坐标,让你从这个n个点中选出k个点,问这个k个点形成的面 ...

  4. Subsequences in Substrings Kattis - subsequencesinsubstrings (暴力)

    题目链接: Subsequences in Substrings Kattis - subsequencesinsubstrings 题目大意:给你字符串s和t.然后让你在s的所有连续子串中,找出这些 ...

  5. G - Intersecting Rectangles Kattis - intersectingrectangles (扫描线)(判断多个矩形相交)

    题目链接: G - Intersecting Rectangles Kattis - intersectingrectangles 题目大意:给你n个矩形,每一个矩形给你这个矩形的左下角的坐标和右上角 ...

  6. E - Emptying the Baltic Kattis - emptyingbaltic (dijkstra堆优化)

    题目链接: E - Emptying the Baltic Kattis - emptyingbaltic 题目大意:n*m的地图, 每个格子有一个海拔高度, 当海拔<0的时候有水. 现在在(x ...

  7. G - Galactic Collegiate Programming Contest Kattis - gcpc (set使用)

    题目链接: G - Galactic Collegiate Programming Contest Kattis - gcpc 题目大意:当前有n个人,一共有m次提交记录,每一次的提交包括两个数,st ...

  8. Kattis - virus【字符串】

    Kattis - virus[字符串] 题意 有一个正常的DNA序列,然后被病毒破坏.病毒可以植入一段DNA序列,这段插入DNA序列是可以删除正常DNA序列中的一个连续片段的. 简单来说就是,给你一段 ...

  9. Kattis - bank 【简单DP】

    Kattis - bank [简单DP] Description Oliver is a manager of a bank near KTH and wants to close soon. The ...

随机推荐

  1. 【DNS域名解析命令】 dig

    dig - DNS lookup utility dig 命令主要用来从 DNS 域名服务器查询主机地址信息. Dig (domain information groper 域名信息搜索)是一个灵活的 ...

  2. 5.Python是怎么解释的?

    Python是怎么解释的? Python language is an interpreted language. Python program runs directly from the sour ...

  3. LNMP企业应用部署全过程(基于DEDE后台)

    系统环境说明: os:centos 5.6 nginx:nginx-1.0.11 php:php-5.3.9 mysql:mysql-5.5.20 文档导读: 一 准备工作 二 基础软件包安装 三 安 ...

  4. python画新冠肺炎国内和世界各国累计确诊数量热图

    新冠肺炎国内疫情基本控制住,很多地方都开始摘下口罩了.但是国外的疫情依然处于爆发期,特别是美国,截止目前其累计确诊数量已突破110w.五一节北京柳絮杨絮满天飞,不适合外出.在家心血来潮,献丑画一下各地 ...

  5. 面向对象第四单元(UML)总结

    OO第四单元 一.总结本单元两次作业的架构设计 第一次作业 架构 第一次作业只有类图,所以全部的UmlElement都可以放在MyUmlInteraction中进行存储.计算和查找.对于类图来说,可以 ...

  6. 两个命令把 Vim 打造成 Python IDE

    运行下面两个命令,即可把 Vim(含插件)配置成 Python IDE.目前支持 MAC 和 Ubuntu. Shell   curl -O https://raw.githubusercontent ...

  7. shell之路 shell核心语法【第四篇】流程控制

    if语句 if ... fi 语句: if ... else ... fi 语句: if ... elif ... else ... fi 语句. 注意: expression 和方括号([ ])之间 ...

  8. F. Multicolored Markers 暴力+二分

    F. Multicolored Markers 题目大意: 给你 a个红块 b个蓝块 拼成一个实心矩形,并且要求红块或者蓝块自成一个矩形,问形成的这个矩形最小的周长是多少. #include < ...

  9. js和jq的获取焦点失去焦点写法

  10. 某科学的PID算法学习笔记

    最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...