题意:
      有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. 华硕h81m一k跳线图_股票入门基础知识:你真的看懂了K线图了?【建议收藏】1...

    导言--就技术分析而言,我们应该牢记这样得一个原则:事物的后续发展常常和他们之前的表象不一致.我们自以为了解很多事实并不是事实,一些看起来显而易见的事情,有时并不是如此. 最近很多人,说,好像股市最近 ...

  2. python做k线图_python做k线图(15分钟k线的意义)

    北大荒... 大家对图中的巨量高开涨停是什么理解的... 庄家最后的出 日k线图又称阴阳烛,最初是日本米商用来表示米价涨跌状况的工具,后来引入股市,并逐渐风行于东南亚地区.k线图以其直观.立体感强的特 ...

  3. 机器人在线“偷懒”怎么办?阿里研究出了这两套算法

    简介: 随着互联网和电子商务的发展以及全球化的不断加速,中国产业持续升级,人工智能与机器人集群逐步被应用于制造业与物流供应链产业中.机器人集群的主要目的是与人协同合作,将人从沉重的重体力搬运任务中解放 ...

  4. GB_T28181-2016.pdf

    国标28181-2016版本检测,由于文件过大,而且博客不支持上传文件,需要GB28181-2016协议文档和公安一所检测文档的可以私信我,QQ:123011785 I C S1 3. 3 1 0 A ...

  5. 股票技术分析--任正德主编

    股票技术分析:散户完全自救手册–任正德主编 第二章 K线分析 2.1 K线的含义及画法 K线画法和含义(日K线) 当日开盘价(a)与当日收盘价(b)组成的区域叫K线实体,若a<b,则称此K线为阳 ...

  6. 2018年第九届蓝桥杯 JavaB组省赛 刷题思路及答案

    前言 本人是二本院校大二的计算机系学生,已经报名了下一届的蓝桥杯省赛,整个寒假学习了很多算法知识,我是看<算法很美>这个课程学习算法的,一套学习下来确实受益匪浅,视频在b站上面都有. 此前 ...

  7. 从Redis+Lua到Goroutine,日均10亿次的股票行情计算实践

    http://www.10tiao.com/html/730/201609/2652941778/1.html 2016-09-14 10:28 陶瑞甫 股票行情数据是一种典型的时序数据(Time-s ...

  8. 2020数字中国 天池——智慧海洋建设 Top1%

    文章目录 Solution 总结 这是前段时间参加的天池比赛,最终成绩:18/3275. 下面先给出我的solution,最后再写一点总结. Solution # coding: utf-8# In[ ...

  9. 深入理解梅尔刻度、梅尔滤波器组和梅尔时频谱图

    前情提要 短时傅里叶变换公式 S ( m , k ) = ∑ n = 1 N − 1 x ( n + m H ) w ( n ) e − i 2 π k N n S(m,k) = \sum_{n=1} ...

最新文章

  1. JS题目总结:原型链/new/json/MVC/Promise
  2. QT的QDtlsClientVerifier类的使用
  3. SQLServer2008快速清理日志文件
  4. MySQL的诡异同步问题-重复执行一条relay-log
  5. python读取日志统计ip_如何通过命令行统计和排列访问日志里的ip数
  6. Hive分区和桶的概念
  7. 那些在一个公司死磕了5-10年的测试员,最后都怎么样了?
  8. taro 小程序转h5之后报错_原生小程序转H5
  9. 转移性乳腺癌的基因组图谱突出了突变和特征频率的变化
  10. git配置ssh秘钥(公钥以及私钥)windows
  11. c++程序设计语言第四版pdf_寒假攻略 | 开启C语言自学模式
  12. pom文件显示删除线
  13. QCC3040---Application启动流程
  14. 截止失真放大电路_新手必看!基本放大电路应该如何分析?
  15. 你也可以找到好工作(二)
  16. 微信Android热补丁方案Tinker
  17. python截屏保存本地_Python截图并保存的具体实例
  18. 江城子 . 程序员之歌
  19. Cesium 角度计算
  20. Anaconda Prompt 用法全集

热门文章

  1. Windows下使用Telnet 命令测试端口号
  2. Python中的内存管理机制
  3. C# DataTable的Select()方法不支持 != 判断
  4. Intellij IDEA 创建Web项目并在Tomcat中部署运行
  5. 端到端的超媒体REST API设计
  6. VS201“.NET研究”0实践RUP4+1架构模型
  7. 在ubuntu10.4安装snort ACID
  8. 04:网络层协议介绍
  9. Vue.js 学习笔记 第5章 内置指令
  10. 解题报告 『生活大爆炸版石头剪刀布(模拟)』