题目描述

Taro is a student of Ibaraki College of Prominent Computing. In this semester, he takes two courses, mathematics and informatics. After each class, the teacher may assign homework. Taro may be given multiple assignments in a single class, and each assignment may have a different deadline. Each assignment has a unique ID number.

Everyday after school, Taro completes at most one assignment as follows. first, he decides which course’s homework to do at random by flipping a coin. Let S be the set of all the unfinished assignments of the chosen course whose deadline has not yet passed. If S is empty, he plays a video game without doing any homework on that day even if there are unfinished assignments of the other course. Otherwise, with T ⊆ S being the set of assignments with the nearest deadline among S, he completes the one with the smallest assignment ID among T.

The number of assignments Taro will complete until the end of the semester depends on the result of coin flips. Given the schedule of homework assignments, your task is to compute the maximum and the minimum numbers of assignments Taro will complete.

输入

The input consists of a single test case in the following format.

n m

s1 t1

.

.

.

sn tn

The first line contains two integers n and m satisfying 1 ≤ m < n ≤ 400. n denotes the total number of assignments in this semester, and m denotes the number of assignments of the mathematics course (so the number of assignments of the informatics course is n − m).

Each assignment has a unique ID from 1 to n; assignments with IDs 1 through m are those of the mathematics course, and the rest are of the informatics course. The next n lines show the schedule of assignments. The i-th line of them contains two integers si and ti satisfying 1 ≤ si ≤ ti ≤ 400, which means that the assignment of ID i is given to Taro on the si-th day of the semester, and its deadline is the end of the ti-th day.

输出

In the first line, print the maximum number of assignments Taro will complete. In the second line, print the minimum number of assignments Taro will complete.

样例输入

6 3

1 2

1 5

2 3

2 6

4 5

4 6

样例输出

6

2


不得不说,日本人的英语真难懂.

题意很简单,就是你有两项作业,一个是数学,一个是信息学,以及布置时间和结束时间。你每天就做一项,然后是抛硬币选作业。假如说你数学做完了,信息学作业还没写,但是天意告诉你要学数学,于是乎你打起了游戏。

  • 完成的最多:

    知道起始时间,用贪心做,先做快结束的。单调队列维护。
  • 完成的最少:

    就是这天你数学作业写完了,信息学作业还没写,但是天意告诉你要学数学。建图:跑网络流

sic->数学作业 f=1

数学作业->天 f=1

天->天 拆点 f=1

天->信息作业 f=1

信息作业->sink f=1

这就意味着如果这天你如果只有一项作业,那就不写

有两项 那就写一项。

  • 为什么拆点? 这样就限制了一天只写一份作业。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+7;
const int maxm=1e6+7;
int n,m,src,sink;
int head[maxn],tol=1,ans;
int cur[maxn],dep[maxn];
const int inf=0x3f3f3f3f;
struct Edge{int to,next,val;}e[maxm];
struct node{int s,t;}s[maxn];
void add(int u,int v,int f){
tol++;
e[tol].to=v;
e[tol].next=head[u];
e[tol].val=f;
head[u]=tol;
}
bool bfs(int s,int t){
queue<int>q;
memset(dep,-1,sizeof(dep));
q.push(s);
dep[s]=0;
while(!q.empty()){
int now=q.front();
q.pop();
for(int v,i=head[now];i;i=e[i].next){
v=e[i].to;
if(dep[v]==-1&&e[i].val){
dep[v]=dep[now]+1;
if(v==t) return true;
q.push(v);
}
}
}
return false;
}
int dfs(int x,int maxx){
if(x==sink) return maxx;
for(int& i=cur[x];i;i=e[i].next){
if(dep[e[i].to]==dep[x]+1&&e[i].val){
int flow=dfs(e[i].to,min(maxx,e[i].val));
if(flow){
e[i].val-=flow;
e[i^1].val+=flow;
return flow;
}
}
}
return 0;
}
void dinic(int s,int t){
ans=0;
while(bfs(s,t)){
for(int i=0;i<=t;i++) cur[i]=head[i];
while(int d=dfs(s,inf)) ans+=d;
}
}
bool cmp(node a,node b)
{
return a.s<b.s;
}
int main()
{
int n,math;
scanf("%d%d",&n,&math);
src=0;
sink=1201;
for(int i=1;i<=math;i++){
scanf("%d%d",&s[i].s,&s[i].t);
add(src,i,1);
add(i,src,0);
for(int j=s[i].s;j<=s[i].t;j++){
add(i,j+400,1);
add(j+400,i,0);
}
}
for(int i=1;i<=400;i++){
add(i+400,i+800,1);
add(i+800,i+400,0);
}
for(int i=math+1;i<=n;i++){
scanf("%d%d",&s[i].s,&s[i].t);
add(i,sink,1);
add(sink,i,0);
for(int j=s[i].s;j<=s[i].t;j++){
add(j+800,i,1);
add(i,j+800,0);
}
}
priority_queue<int, vector<int>, greater<int> > Q;
sort(s+1,s+n+1,cmp);
int now=1,ans1=0;
for(int i=1;i<=400;i++){
while(now<=n&&i==s[now].s) {Q.push(s[now].t);now++;}
if(!Q.empty()&&i<=Q.top()){Q.pop();ans1++;}
while(!Q.empty()&&i>=Q.top()){Q.pop();}
}
dinic(src,sink);
printf("%d\n",ans1);
printf("%d\n",ans);
return 0;
}

【网络流+贪心】Homework的更多相关文章

  1. 洛谷P1251 餐巾(网络流)

    P1251 餐巾 15通过 95提交 题目提供者该用户不存在 标签网络流贪心 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 为什么我全部10个测试点都对… 题目描述 一个餐厅在相继的N天里 ...

  2. woj1008feedinganimals2-贪心-网络流

    title: woj1008feedinganimals2-贪心-网络流 date: 2020-03-07 categories: acm tags: [acm,woj,网络流,贪心] 中等题. 标准 ...

  3. bzoj3661

    网络流/贪心 网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为1的边,然后设立一个中转站,来控制可以换的数量,容量限制l.时限100s,能跑过去我的太慢了,一个点100s 正解 ...

  4. HDU 1789 Doing Homework again(贪心)

    Doing Homework again 这只是一道简单的贪心,但想不到的话,真的好难,我就想不到,最后还是看的题解 [题目链接]Doing Homework again [题目类型]贪心 & ...

  5. 【CodeForces 589F】Gourmet and Banquet(二分+贪心或网络流)

    F. Gourmet and Banquet time limit per test 2 seconds memory limit per test 512 megabytes input stand ...

  6. HDU 1789 Doing Homework again(贪心)

    在我上一篇说到的,就是这个,贪心的做法,对比一下就能发现,另一个的扣分会累加而且最后一定是把所有的作业都做了,而这个扣分是一次性的,所以应该是舍弃扣分小的,所以结构体排序后,往前选择一个损失最小的方案 ...

  7. hdu--1798--Doing Homework again(贪心)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)

    https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...

  9. 【BZOJ3716】[PA2014]Muzeum(贪心,网络流)

    [BZOJ3716][PA2014]Muzeum(贪心,网络流) 题面 BZOJ 题解 很明显可以写最大权闭合子图,然后会\(TLE\)成傻逼. 为了方便,就把一个警卫能够看到的范围处理一下(把坐标系 ...

随机推荐

  1. SASS - 语法

    SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...

  2. SQL COOKBOOK SQL经典实例代码 笔记第一章代码

    -- SQL COOKBOOK CHAPTER1 -- 查看所有内容 select * from emp; -- 可以单列 select empno,ename,job,sal,mgr,hiredat ...

  3. python 进程和线程(2)

    这篇博客是按照博客<进程和线程(1)>中内容用futures改写  with futures.ProcessPoolExecutor() as executor:可以两篇博客对照看. 2改 ...

  4. 新浪sae url rewrite(伪静态、重定向)详解

    新浪sae url rewrite(伪静态.重定向)详解 http://www.veryhuo.com phpclubs 2011-11-14 投递稿件 sae全程Sina App Engine,真是 ...

  5. nodejs(8) 使用ejs渲染动态页面

    使用ejs渲染动态页面 步骤: 安装 ejs 模板引擎npm i ejs -S 使用 app.set() 配置默认的模板引擎 app.set('view engine', 'ejs') 使用 app. ...

  6. ES系列之Promise async 和 await

    概述 promise是异步编程的一种解决方案,比传统的解决方案—回调函数和事件—更合理更强大. 所谓的promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作的结果). Pro ...

  7. bitcoind

    Bitcoin Core Daemon version v0.15.1.0-g7b57bc998f Usage: bitcoind [options] Start Bitcoin Core Daemo ...

  8. studentmanagement

    package javatestywh; public class ScoreInformation { private String stunumber; private String name; ...

  9. java将HSSFWorkbook生成的excel压缩到zip中

    思路:1.写入输入流中. 2.将输入流加到ZipOutputStream压缩流中 List<DocumentModel> list = null; try { list = documen ...

  10. 奔跑的绵羊js

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...