【网络流+贪心】Homework
题目描述
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的更多相关文章
- 洛谷P1251 餐巾(网络流)
P1251 餐巾 15通过 95提交 题目提供者该用户不存在 标签网络流贪心 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 为什么我全部10个测试点都对… 题目描述 一个餐厅在相继的N天里 ...
- woj1008feedinganimals2-贪心-网络流
title: woj1008feedinganimals2-贪心-网络流 date: 2020-03-07 categories: acm tags: [acm,woj,网络流,贪心] 中等题. 标准 ...
- bzoj3661
网络流/贪心 网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为1的边,然后设立一个中转站,来控制可以换的数量,容量限制l.时限100s,能跑过去我的太慢了,一个点100s 正解 ...
- HDU 1789 Doing Homework again(贪心)
Doing Homework again 这只是一道简单的贪心,但想不到的话,真的好难,我就想不到,最后还是看的题解 [题目链接]Doing Homework again [题目类型]贪心 & ...
- 【CodeForces 589F】Gourmet and Banquet(二分+贪心或网络流)
F. Gourmet and Banquet time limit per test 2 seconds memory limit per test 512 megabytes input stand ...
- HDU 1789 Doing Homework again(贪心)
在我上一篇说到的,就是这个,贪心的做法,对比一下就能发现,另一个的扣分会累加而且最后一定是把所有的作业都做了,而这个扣分是一次性的,所以应该是舍弃扣分小的,所以结构体排序后,往前选择一个损失最小的方案 ...
- hdu--1798--Doing Homework again(贪心)
Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)
https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...
- 【BZOJ3716】[PA2014]Muzeum(贪心,网络流)
[BZOJ3716][PA2014]Muzeum(贪心,网络流) 题面 BZOJ 题解 很明显可以写最大权闭合子图,然后会\(TLE\)成傻逼. 为了方便,就把一个警卫能够看到的范围处理一下(把坐标系 ...
随机推荐
- Floyd--P1119 灾后重建
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- POJ - 1631 Bridging signals(最长上升子序列---LIS)
题意:左右各n个端口,已知n组线路,要求切除最少的线路,使剩下的线路各不相交,按照左端口递增的顺序输入. 分析: 1.设左端口为l,右端口为r,因为左端口递增输入,l[i] < l[j](i & ...
- JS添加、设置属性以及鼠标移入移出事件
源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- Bugku 加密(持续更新)
1.滴答~滴 不多说,摩斯密码解密. 2.聪明的小羊 栅栏密码解密. 3.ok Ook解密 4.这不是摩斯密码 brainfuck解码 5.简单加密 凯撒有两种编码脚本,一种是字母26内循环移位,一种 ...
- pycharm使用常见设置
字体修改: file——setting——Editor——font(快捷键:ctrl+alt+s) 修改项目编译器:a,b方法二选一 a.ctrl+alt+s,调出设置窗口——选中想要换的版本即可,如 ...
- 怎么调出原生态launcher
adb shell am start -n com.android.launcher3/.Launcher
- ACwing算法基础课听课笔记(第一章,基础算法一)(二分)
二分法: 在看这个视频前,我对于二分法是一头雾水的,又加上这个算法平常从来没写过所以打了一年了还没正式搞过.视频提到ACwing上的一道题,我用自以为聪明的方法去做,结果TLE了,实在丢人,不说了,开 ...
- 201771010123汪慧和《面向对象程序设计JAVA》第八周实验总结
一.理论部分 1.接口 用interface声明,是抽象方法和常量值定义的集 合.从本质上讲,接口是一种特殊的抽象类. 在Java程序设计语言中,接口不是类,而是对类 的一组需求描述,由常量和一组抽象 ...
- 用Axure画原型图有感
感觉前端做UE非常有优势啊- 但是在制作的时候,似乎陷入了误区: (1)只求原型图的漂亮,色彩丰富,忽略了其本质作用,是用来整理逻辑,画出逻辑流程的. (2)一开始就追求交互,高保真的原型,忽视了细节 ...
- Dynamics CRM - 不同类型字段在 Plugin 里的赋值方式
在编写 Plugin 代码之前,我们可以需要用 SDK bin 目录下的 CrmSvcUtil.exe 来将 CRM Site 上所有的 Entity 转换成类,而 Entity 里的 Field 也 ...