题意:

      有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次的更多相关文章

  1. BZOJ1737 [Usaco2005 jan]Naptime 午睡时间

    断环然后裸DP就好了... $f[i][j][k]$表示1号时间段没有被算入答案,到了第$i$个时间段,一共选了$j$个时间段,$k = 0 /1$表示第i个时间段有没有被算进答案的最优值 $g[i] ...

  2. 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015)

    题目链接 :  http://codeforces.com/gym/100781/attachments A-Adjoin the Network 题意大概是有多棵树(也可能是一颗),现在要把它们合并 ...

  3. #433 Div2 Problem C Planning (贪心 && 优先队列)

    链接 : http://codeforces.com/contest/854/problem/C 题意 : 有 n 架飞机需要分别在 1~n 秒后起飞,允许起飞的时间是从 k 秒后开始,给出每一架飞机 ...

  4. django模型操作

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表        

  5. mysql时间格式化,按时间段查询的MySQL语句

    描述:有一个会员表,有个birthday字段,值为'YYYY-MM-DD'格式,现在要查询一个时间段内过生日的会员,比如'06-03'到'07-08'这个时间段内所有过生日的会员. SQL语句: Se ...

  6. mysql时间格式化,按时间段查询MYSQL语句

    描述:有一个会员表,有个birthday字段,值为'YYYY-MM-DD'格式,现在要查询一个时间段内过生日的会员,比如'06-03'到'07-08'这个时间段内所有过生日的会员. SQL语句: Se ...

  7. 数据可视化:Echart中k图实现动态阈值报警及实时更新数据

    1 目标 使用Echart的k图展现上下阈值,并且当真实值超过上阈值或低于下阈值时候,标红报警. 2 实现效果 如下:

  8. MySql按日期时间段进行统计(前一天、本周、某一天、某个时间段)

    在mysql数据库中,常常会遇到统计当天的内容.例如,在user表中,日期字段为:log_time 统计当天 sql语句为: select * from user where date(log_tim ...

  9. awk和sed截取nginx和tomcat时间段日志

    1 nginx日志截取示例 日志路径:/usr/local/nginx/logs, 截取access.log中2019年3月24日17点00~02之间的日志: 写法1: cat access.log ...

随机推荐

  1. day1_安装及建立数据库和表

    #第一份数据库及表create database library; use library; create table book( id int primary key, book_name char ...

  2. Linux速通 随笔整理

    Linux速通 随笔整理 为了方便阅读,特整理了相关的学习笔记 零.大纲 一.系统安装 二.命令格式 三.文件管理 四.用户群组 五.文件处理 六.系统初始化及监控 七.硬盘初始化 八.网络原理

  3. 学习版pytest内核测试平台开发万字长文入门篇

    前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...

  4. 爬虫入门到放弃系列05:从程序模块设计到代理IP池

    前言 上篇文章吧啦吧啦讲了一些有的没的,现在还是回到主题写点技术相关的.本篇文章作为基础爬虫知识的最后一篇,将以爬虫程序的模块设计来完结. 在我漫(liang)长(nian)的爬虫开发生涯中,我通常将 ...

  5. 关于主机不能访问虚拟机的web服务解决

    centos7默认并没有开启80端口,我们只有开启就行 [root@localhost sysconfig]# firewall-cmd --permanent --add-port=3032/tcp ...

  6. WPF 基础 - xaml 语法总结

    Attribute 与 Property 之间的区别 Property 对应着抽象对象身上的性状: Attribute 是针对标签的特征: 往往一个标签具有的 Attribute 对于它所代表的对象的 ...

  7. MySQL优化从执行计划开始(explain超详细)

    前言 小伙伴一定遇到过这样反馈:这页面加载数据太慢啦,甚至有的超时了,用户体验极差,需要赶紧优化: 反馈等同于投诉啊,多有几次,估计领导要找你谈话啦. 于是不得不停下手里头的活,赶紧进行排查,最终可能 ...

  8. Git命令太多记不住?有了这个神器,从此告别输入命令行

    一 .SourceTree简介 SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是Mercurial和Subve ...

  9. Centos7安装maven详情以及配置

    一.maven安装: 1.获取maven下载地址: 查询maven最新版本地址:https://maven.apache.org/download.cgi 当前最新版本为maven 3.6.3    ...

  10. Android Stuio让我濒临崩溃的bug之cause: unable to find valid certification path to requested target

    •问题描述 像往常一样,打开 $android studio$ 开启愉快的开发之旅: 写着写着,右下角弹出一个对话,说 $android studio$ 有新版本可更新: 有新版本为何不用,果断点击 ...