题目链接:http://codeforces.com/problemset/problem/31/C

题目意思:给出 n 个 lessons 你,每个lesson 有对应的 起始和结束时间。问通过删除一个lesson后能否使得所有lesson 持续的时间互不相交。注意,如果某个lesson结束的时刻恰好是另一个 lesson 的开始时刻,那么这两个lesson 也看作是不相交的。

看了题目之后,一如既往地,没什么想法= =。C题好多时候都这样,继续努力!!!

想着看Tutorial 直接学习,怎么知道没有滴,可能是太过久远了。只能看别人代码学了,学了个用时最少的GNU C++,不由得感叹,该人的解决方法真是巧妙,给个赞他,太聪明了!!!

我们先假定每个lesson 占据的时间是一段段的,左右两个端点分别是起始和终止时刻。用一个统计每个时刻出现次数的数组temp,对于第 i 个lesson 起始时刻in[i][0] 就 temp[in[i][0]]++,终止时刻 in[i][1] 就temp[in[i][1]]-- 。这样构造的好处应该就是把所有lesson 统一于只有一条特长线段来处理,可以发现,如果某一个时刻出现3次以上,就无论删除哪个lesson 都不可能使得所有lesson 的时间都不相交了,恰好2次的话可以尝试删除其中一个lesson 来验证之。如果某个lesson的结束时刻ti 是另一个lesson的开始时刻,就标记这个 ti 为0次。

可以发现,如果有解的话,次数标记数组temp 不会有超过3个1的时刻或者某个时刻出现3次以上出现的。

有点只可意会不能言转啊,就是很佩服这个人的解题思路。应该是多年做题的经验和直觉啦。

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std; const int maxn = + ;
const int N = 1e6 + ; int in[maxn][];
int temp[N];
vector<int> ans; int main()
{
int n, i;
while (scanf("%d", &n) != EOF)
{
ans.clear();
memset(in, , sizeof(in));
memset(temp, , sizeof(temp));
for (i = ; i <= n; i++)
{
scanf("%d%d", &in[i][], &in[i][]);
temp[in[i][]]++;
temp[in[i][]]--;
}
int a = -, b = -;
int maxx = ;
for (i = ; i <= N; i++)
{
maxx += temp[i];
if (maxx > ) // <= 1表示本来的lesson已经两两不相交了,最终删除哪个lesson都满足条件
{
if (maxx >= ) // 怎么删除都不符合条件,因为有多于两个以上的 lesson 占据这个时刻
{
printf("0\n");
return ;
}
if (a == -)
a = i;
b = i;
}
}
for (i = ; i <= n; i++)
{
if (a == - || in[i][] <= a && b <= in[i][]-) // [a,b] 表示最小可删除区间,大于等于这个区间的lesson都可以删除
ans.push_back(i);
}
printf("%d\n", ans.size());
if (ans.size())
{
printf("%d", ans[]);
for (int i = ; i < ans.size(); i++)
printf(" %d", ans[i]);
printf("\n");
}
}
return ;
}

codeforces 31C Schedule 解题报告的更多相关文章

  1. LeetCode - Course Schedule 解题报告

    以前从来没有写过解题报告,只是看到大肥羊河delta写过不少.最近想把写博客的节奏给带起来,所以就挑一个比较容易的题目练练手. 原题链接 https://leetcode.com/problems/c ...

  2. codeforces 499B.Lecture 解题报告

    题目链接:http://codeforces.com/problemset/problem/499/B 题目意思:给出两种语言下 m 个单词表(word1, word2)的一一对应,以及 profes ...

  3. codeforces 495C. Treasure 解题报告

    题目链接:http://codeforces.com/problemset/problem/495/C 题目意思:给出一串只有三种字符( ')','(' 和 '#')组成的字符串,每个位置的这个字符 ...

  4. codeforces 490B.Queue 解题报告

    题目链接:http://codeforces.com/problemset/problem/490/B 题目意思:给出每个人 i 站在他前面的人的编号 ai 和后面的人的编号 bi.注意,排在第一个位 ...

  5. CodeForces 166E -Tetrahedron解题报告

    这是本人写的第一次博客,学了半年的基础C语言,初学算法,若有错误还请指正. 题目链接:http://codeforces.com/contest/166/problem/E E. Tetrahedro ...

  6. codeforces 489A.SwapSort 解题报告

    题目链接:http://codeforces.com/problemset/problem/489/A 题目意思:给出一个 n 个无序的序列,问能通过两两交换,需要多少次使得整个序列最终呈现非递减形式 ...

  7. codeforces 485A.Factory 解题报告

    题目链接:http://codeforces.com/problemset/problem/485/A 题目意思:给出 a 和 m,a 表示第一日的details,要求该日结束时要多生产 a mod ...

  8. codeforces 483A. Counterexample 解题报告

    题目链接:http://codeforces.com/problemset/problem/483/A 题目意思:给出一个区间 [l, r],要从中找出a, b, c,需要满足 a, b 互质,b, ...

  9. codeforces 479C Exams 解题报告

    题目链接:http://codeforces.com/problemset/problem/479/C 题目意思:简单来说,就是有个人需要通过 n 门考试,每场考试他可以选择ai, bi 这其中一个时 ...

随机推荐

  1. putnik

    可将旅行商的路线看作是从n - 1号点出发, 跳着到0号点, 再折返走完之前跳过的点. 想到这个, 暴力就可以得50分. 正解是DP. f[i][j](i > j)表示, 从i开始跳, 并返回至 ...

  2. openfire Android学习(六)----总结

    Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...

  3. 【转载】React入门实例教程-读书笔记

    参考了这篇文章: http://www.ruanyifeng.com/blog/2015/03/react.html 其中github 安装配置见上一篇文章(link) 一.HTML 模板 使用 Re ...

  4. log4net菜鸟指南

    log4net的作用 提供一个记录日志的框架,可以将日志信息记录到文件(txt.xml等).控制台.Windows事件日志和数据库(MSSQL.Acess.Oracle.DB2和SQLite等). 要 ...

  5. Android Design Support Library概览

    尊重劳动成果.转载请注明出处:http://blog.csdn.net/growth58/article/details/47972467 关注新浪微博:@于卫国 邮箱:yuweiguocn@gmai ...

  6. Vue 字面量语法 vs 动态语法

    初学者常犯的一个错误是使用字面量语法传递数值: <!-- 传递了一个字符串 "1" --> <comp some-prop="1">&l ...

  7. 不错.net图片水印类

    using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Draw ...

  8. com关于IUnknown接口

    com定义的每个接口都必须从IUnknown继承过来,主要原因是IUnknown接口提供了两个很重要的特性:生存期控制和接口查询. 客户程序仅仅能通过接口与com对象进行通信.尽管客户程序能够无论对象 ...

  9. python-tornado操作

    Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效 ...

  10. POJ 3211 Washing Clothes(01背包)

    POJ 3211 Washing Clothes(01背包) http://poj.org/problem?id=3211 题意: 有m (1~10)种不同颜色的衣服总共n (1~100)件.Dear ...