《挑战程序设计竞赛》P345 观看计划

题意:一周一共有M个单位的时间。一共有N部动画在每周si时开始播放,ti时刻播放结束,问每周最多能看多少部动画。

思路:贪心+倍增法

可以看成一个圆周上有N个区间,找出N个区间中尽可能多的互不相交的区间。选定一个区间作为起始区间后,贪心思想是:每次尽量选取与当前区间不重合且结束时间最早的区间。

那么贪心策略还可以这样考虑,对于某区间i,选择区间j满足(i的结束时间t[i]<j的开始时间s[j]),从这些j中选择一个结束时间最早区间(记为k)作为区间i的下一个区间,记为next[i]=k;

有了next数组即可倍增来优化了,譬如next[1][i]=j,next[1][j]=k,则next[2][i]=k,意为i跨两个区间可以到达区间k.

参考代码:

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
#define INF 0x3f
#define N_MAX 100000+20
#define NLOG 30
pair<int, int>ps[*N_MAX];
int s[N_MAX*+],t[N_MAX*+];
int Next[NLOG][N_MAX];
int n, m; bool cmp(const pair<int,int>p1,const pair<int,int>p2) {
if (p1.first != p2.first)return p1.first < p2.first;
else return p1.second > p2.second;//若某一个区间头部和另一个区间的尾部时间点重合,尾部在前!!
} int main() {
while (scanf("%d%d",&n,&m)!=EOF) {
for (int i = ; i < n; i++) {
scanf("%d%d",&s[i],&t[i]);
}
for (int i = ; i < n;i++) {
if (s[i] > t[i])t[i] += m;
s[i + n] = s[i] + m;
t[i + n] = t[i] + m;
}
for (int i = ; i < *n;i++) {
ps[i] = make_pair(s[i], i);//区间头部
ps[i+*n] = make_pair(t[i], i+*n);//区间尾部
}
sort(ps, ps + * n,cmp);
int last = -;
memset(Next,-,sizeof(Next));
for (int i = *n-; i >=;i--) {//!!!!!
int id = ps[i].second;
if (id < * n) {
if (last == - || t[last] > t[id]) last = id;
}
else {
id -= * n;
Next[][id] = last;
}
}
for (int k = ; k +< NLOG;k++) {
for (int i = ; i < *n;i++) {
if (Next[k][i] == -)Next[k + ][i] = -;
else
Next[k + ][i] = Next[k][Next[k][i]];
}
}
int max_cnt = ;
for (int i = ; i < n;i++) {//选定一个初始城市
int j = i,cnt=;//j代表当前所在城市
for (int k = NLOG - ; k >= ;k--) {
if (Next[k][j] >= && t[Next[k][j]] <= s[i] + m) {
j = Next[k][j];
cnt |= << k;
}
}
max_cnt = max(max_cnt, cnt+);//不要忘了一开始选为起点的区间
}
printf("%d\n",max_cnt);
}
return ;
}

挑战程序设计竞赛》P345 观看计划的更多相关文章

  1. Aizu 2249Road Construction 单源最短路变形《挑战程序设计竞赛》模板题

    King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...

  2. 《挑战程序设计竞赛》2.3 动态规划-优化递推 POJ1742 3046 3181

    POJ1742 http://poj.org/problem?id=1742 题意 有n种面额的硬币,面额个数分别为Ai.Ci,求最多能搭配出几种不超过m的金额? 思路 据说这是传说中的男人8题呢,对 ...

  3. POJ 2386 Lake Counting 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=2386 <挑战程序设计竞赛>习题 题目描述Description Due to recent rains, water has ...

  4. poj 3253 Fence Repair 贪心 最小堆 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=3253 题解 本题是<挑战程序设计>一书的例题 根据树中描述 所有切割的代价 可以形成一颗二叉树 而最后的代价总和是与子节点和深 ...

  5. 《挑战程序设计竞赛》 4.1.1 矩阵 P286

    想写几篇挑战的感悟,也有助于自己理解这本书.但这上面大多贴的是书上的代码,主要是为了用的时候后直接复制就好了,这样就很方便了,就相当于黑盒模板了. 1.线性方程组 /** \brief 高斯消元法 * ...

  6. poj1182食物链_并查集_挑战程序设计竞赛例题

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65534   Accepted: 19321 Description ...

  7. 迷宫问题_BFS_挑战程序设计竞赛p34

    给定一个N*M的迷宫,求从起点到终点的最小步数. N,M<100: 输入: 10 10#S######.#......#..#.#.##.##.#.#........##.##.####.... ...

  8. 【网络流#9】POJ 2135 Farm Tour 最小费用流 - 《挑战程序设计竞赛》例题

    [题意]给出一张无向图,从1开始到n,求两条没有公共边的最短路,使得路程总和最小 每条边的权值设为费用,最大流量设为1,然后就是从源点到汇点流量为2的最小费用流. 因为是规定了流量,新建一个源点和一个 ...

  9. 【网络流#8】POJ 3469 Dual Core CPU 最小割【ISAP模板】 - 《挑战程序设计竞赛》例题

    [题意]有n个程序,分别在两个内核中运行,程序i在内核A上运行代价为ai,在内核B上运行的代价为bi,现在有程序间数据交换,如果两个程序在同一核上运行,则不产生额外代价,在不同核上运行则产生Cij的额 ...

随机推荐

  1. 【点分树】codechef Yet Another Tree Problem

    已经连咕了好几天博客了:比较经典的题目 题目大意 给出一个 N 个点的树和$K_i$, 求每个点到其他所有点距离中第 $K_i$ 小的数值. 题目分析 做法一:点分树上$\log^3$ 首先暴力做法: ...

  2. js数组中去重对象

    var allCourses = new Array();var coursesId = new Array();function findCourses() { Courses.data().eac ...

  3. 用PHP和Python生成短链接服务的字符串ID

    假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E70Piib对应的就是存储长链接地址的数据记录的I ...

  4. 如何禁止js缓存?

    <html> <head> <script type="text/javascript"> document.write("<s ...

  5. windows7下将Cygwin加入右键菜单,并从当前目录打开

    第一步:修改windows注册表 1·开始->运行(或者win键+R),输入REGEDIT,回车,打开注册表编辑器: 2·找到HKEY_CLASSES_ROOT\Directory\Backgr ...

  6. Crane UVA - 1611 思路+构造

    题目:题目链接 思路:思路+构造,假设 i  在pos 位置,那么如果 (pos-i-1)*2+i+1 <= n,那么可以操作一次换过来,如果他们之间元素个数是偶数,那么交换 i - pos,如 ...

  7. BFS:HDU-1242-Rescue(带守卫的迷宫问题)(优先队列)

    解题心得: 1.读清楚题意,本题的题意是有多个'r'(起点),多个r多个bfs比较最短的时间即可,但是hdoj的数据比较水,直接一个起点就行了,迷宫里有多个守卫,如果在路途中遇到守卫会多花费一个时间点 ...

  8. 实验一 查看CPU和内存,用机器指令和汇编指令编程

    (1):使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内存的变化. 机器码        汇编指令 b8 20 4e     mov ax,4E20H 05 ...

  9. 笔记-python-standard library-9.6 random

    笔记-python-standard library-9.6 random 1.      random source code:Lib/random.py 1.1.    functions for ...

  10. Redis实现之RDB持久化(二)

    RDB文件结构 在Redis实现之RDB持久化(一)这一章中,我们介绍了Redis服务器保存和载入RDB文件的方法,在这一节,我们将对RDB文件本身进行介绍,并详细说明文件各个部分的结构和意义.图1- ...