POJ3762 时间段用k次
题意:
有n个任务,每个任务有自己的开始时间和结束时间,还有完成这个任务能获得的价值,然后每一天的同一个时刻只能执行一个任务,每个任务必须连续执行完成,最多可以工作m天,问这m天能获得的最大价值。
思路:
一开始没想太多,直接建立一个图,然后TLE了,先说下我TLE的那个吧!,逻辑上应该没错,是时间过不起,我是先把每一个点差点,拆成两个,流量1,费用是他的价值,然后虚拟出来一个点,连接所有点,流量是1,意思是所有点都可以作为这一天的开始,然后每一个点都连接干完这个活之后可以在干的另一个活,流量是1,费用0,最后所有的点在连接终点,流量1,费用0,意思是每一个点都可以作为这一天的最后一个任务,然后在超级源点那在虚拟出来一个点,和起点连接,流量m费用0,意思最多可以干m天,结果TLE了,现在说下官方题解,官方题解也非常简单容易理解,是这样的,我们可以吧所有涉及的时间点都拿出来,然后sort离散化一下,然后得到一个<=n*2的点集,(<是因为可能有重复的时间点),把这一串点集全都连接上,i->i+1
流量是INF,费用是0,这样的目的是任意两个任务之间虽然没有交集,但是也可以用0花费连接起来,然后对于每一个任务,他的起点和终点都对应着离散化之后的某两个点,然后把这两个点之间俩接一条边,流量1,费用是这个任务的价值,最后再在第一个点之前虚拟出来一个点s连接第一个点,流量是m费用是0,限制天数用的,然后在在最后一个离散化后的点连接一个虚拟的t(这个虚拟的t可以不用,我个人习惯,于是就用了),最后一遍费用流就行了。官方的这个做法的边数是n的,我的那个是n*n的,n的这个我的都跑了1300多了,n*n的必然TLE了。
#include<map>
#include<queue>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N_node 5000
#define N_edge 50000
#define INF 1000000000
using namespace std;
typedef struct
{
int from ,to ,next ,cost ,flow;
}STAR;
typedef struct
{
int a ,b ,c;
}NODE;
STAR E[N_edge];
NODE node[2200];
int list[N_node] ,tot;
int mer[N_node] ,s_x[N_node] ,mark[N_node];
int num[N_node];
map<int ,int>hash;
void add(int a ,int b ,int c ,int d)
{
E[++tot].from = a;
E[tot].to = b;
E[tot].cost = c;
E[tot].flow = d;
E[tot].next = list[a];
list[a] = tot;
E[++tot].from = b;
E[tot].to = a;
E[tot].cost = -c;
E[tot].flow = 0;
E[tot].next = list[b];
list[b] = tot;
}
bool Spfa(int s ,int t ,int n)
{
for(int i = 0 ;i <= n ;i ++)
s_x[i] = -INF ,mark[i] = 0;
queue<int>q;
s_x[s] = 0 ,mark[s] = 1;
q.push(s);
memset(mer ,255 ,sizeof(mer));
while(!q.empty())
{
int xin ,tou;
tou = q.front();
q.pop();
mark[tou] = 0;
for(int k = list[tou] ;k ;k = E[k].next)
{
xin = E[k].to;
if(s_x[xin] < s_x[tou] + E[k].cost && E[k].flow)
{
s_x[xin] = s_x[tou] + E[k].cost;
mer[xin] = k;
if(!mark[xin])
{
mark[xin] = 1;
q.push(xin);
}
}
}
}
return mer[t] != -1;
}
int M_C_Flow(int s ,int t ,int n)
{
int minflow ,maxflow = 0 ,maxcost = 0;
while(Spfa(s ,t ,n))
{
minflow = INF;
for(int i = mer[t] ;i + 1 ;i = mer[E[i].from])
if(minflow > E[i].flow) minflow = E[i].flow;
for(int i = mer[t] ;i + 1 ;i = mer[E[i].from])
{
E[i].flow -= minflow;
E[i^1].flow += minflow;
maxcost += minflow * E[i].cost;
}
maxflow += minflow;
}
return maxcost;
}
int main ()
{
int i ,j ,n ,m;
int a ,b ,c ,aa ,bb ,cc ,d;
while(~scanf("%d %d" ,&n ,&m))
{
memset(list ,0 ,sizeof(list)) ,tot = 1;
int nowid = 0;
for(i = 1 ;i <= n ;i ++)
{
scanf("%d:%d:%d %d:%d:%d %d" ,&a ,&b ,&c ,&aa ,&bb ,&cc ,&d);
node[i].a = c*1+b*60+a*3600;
node[i].b = cc*1+bb*60+aa*3600;
node[i].c = d;
num[++nowid] = node[i].a;
num[++nowid] = node[i].b;
}
sort(num + 1 ,num + nowid + 1);
int now = 0;
for(i = 1 ;i <= nowid ;i ++)
{
if(i == 1 || num[i] != num[i-1]) now ++;
hash[num[i]] = now;
}
memset(list ,0 ,sizeof(list)) ,tot = 1;
add(0 ,1 ,0 ,m);
for(i = 2 ;i <= now ;i ++)
add(i - 1 ,i ,0 ,INF);
add(now ,now + 1 ,0 ,m);
for(int i = 1 ;i <= n ;i ++)
add(hash[node[i].a] ,hash[node[i].b] ,node[i].c ,1);
int Ans = M_C_Flow(0 ,now + 1 ,now + 1);
printf("%d\n" ,Ans);
}
return 0;
}
POJ3762 时间段用k次的更多相关文章
- BZOJ1737 [Usaco2005 jan]Naptime 午睡时间
断环然后裸DP就好了... $f[i][j][k]$表示1号时间段没有被算入答案,到了第$i$个时间段,一共选了$j$个时间段,$k = 0 /1$表示第i个时间段有没有被算进答案的最优值 $g[i] ...
- 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015)
题目链接 : http://codeforces.com/gym/100781/attachments A-Adjoin the Network 题意大概是有多棵树(也可能是一颗),现在要把它们合并 ...
- #433 Div2 Problem C Planning (贪心 && 优先队列)
链接 : http://codeforces.com/contest/854/problem/C 题意 : 有 n 架飞机需要分别在 1~n 秒后起飞,允许起飞的时间是从 k 秒后开始,给出每一架飞机 ...
- django模型操作
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表
- mysql时间格式化,按时间段查询的MySQL语句
描述:有一个会员表,有个birthday字段,值为'YYYY-MM-DD'格式,现在要查询一个时间段内过生日的会员,比如'06-03'到'07-08'这个时间段内所有过生日的会员. SQL语句: Se ...
- mysql时间格式化,按时间段查询MYSQL语句
描述:有一个会员表,有个birthday字段,值为'YYYY-MM-DD'格式,现在要查询一个时间段内过生日的会员,比如'06-03'到'07-08'这个时间段内所有过生日的会员. SQL语句: Se ...
- 数据可视化:Echart中k图实现动态阈值报警及实时更新数据
1 目标 使用Echart的k图展现上下阈值,并且当真实值超过上阈值或低于下阈值时候,标红报警. 2 实现效果 如下:
- MySql按日期时间段进行统计(前一天、本周、某一天、某个时间段)
在mysql数据库中,常常会遇到统计当天的内容.例如,在user表中,日期字段为:log_time 统计当天 sql语句为: select * from user where date(log_tim ...
- awk和sed截取nginx和tomcat时间段日志
1 nginx日志截取示例 日志路径:/usr/local/nginx/logs, 截取access.log中2019年3月24日17点00~02之间的日志: 写法1: cat access.log ...
随机推荐
- [个人总结]pytorch中用checkpoint设置恢复,在恢复后的acc上升
原因是因为checkpoint设置好的确是保存了相关字段.但是其中设置的train_dataset却已经走过了epoch轮,当你再继续训练时候,train_dataset是从第一个load_data开 ...
- 04-Spring自定义标签解析
自定义标签的解析 这一篇主要说明自定义标签的解析流程,除了 bean.alias.import.beans之外的标签,都属于自定义标签的范围,自定义标签的解析需要命名空间配合, 获取对应的命名空间 根 ...
- P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)
题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...
- mysql 统计新增每天数据
#创建基表 CREATE TABLE `table_sum` ( `id` int(11) NOT NULL AUTO_INCREMENT, `table_name` varchar(50) ...
- Visual Studio添加引用的方式
- [Azure Devops] 使用 Azure Repos 管理代码
1. 什么是 Azure Repos Azure Repos 是一组版本控制工具,可用于管理代码.无论您的软件项目是大型项目还是小型项目,都应尽快使用版本控制. 版本控制系统是可帮助您跟踪随时间变化对 ...
- 痞子衡嵌入式:MCUXpresso IDE下在线调试时使用不同复位策略的现象总结
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下在线调试时使用不同复位策略的现象总结. 本篇实际上是<IAR在线调试时设不同复位类型可能会导致i.M ...
- Python的flask接收前台的ajax的post数据和get数据
ajax向后台发送数据: ①post方式 ajax: @app.route("/find_worldByName",methods=['POST']) type:'post', d ...
- 201871030125-王芬 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...
- BUAAOO第三单元总结
JML理论基础 JML规定了一些语法,用这些语法可以描述一个方法,一个类的行为,理论基础是离散数学吧 JML常用语法 前置条件: 使用 require + 表达式 ,表达式一般为布尔表达式 副作用: ...