1492 探案第二部

 时间限制: 1 s
 空间限制: 128000 KB
 
 
题目描述 Description

我们伟大的 Sherlock·Holmes 先生最近遇上了一件相当棘手的案子,随着对案情逐渐深入的研究,他开始意识到:此案地域横跨欧洲,而起因可以追溯到50年前!为了尽快搜集各方面的线索,他决定与Dr. Watson分头行动。

Holmes列出了若干需要的线索:某处的一些雪茄烟灰;地下室油画上的颜料的呈色;Black兄弟与他们邻里的联系……诸如此类。而搜集这些线索需要一定的时间。不过,有些线索是相关联的,即在得到某个线索的时候,一并可以得出其他结论(我们可以认为这是不需要时间的)

请充分相信Holmes先生!他无比敏锐的思维足够将所有线索串联,以完美的推理侦破这件名噪一时的大案!

输入描述 Input Description

第一行为N,表示N个需要搜集的线索(N<=1000)

接下来N行,每行两个整数ai,bi, 分别表示Holmes,Watson搜集第i个线索所需要的时间。(ai,bi<=15)

接下来若干行,每行两个整数x,y,表示得到x, 同时能够得到y。

输出描述 Output Description

一个整数,即搜集所有线索的最小耗时。

样例输入 Sample Input

2

5 6

3 9

1 2

样例输出 Sample Output

5

原图缩点,得到一条链

那么只需要探索链的起点即可

可以想到dp[i][j] 表示第1个人用时为i,第2个人用时为j时否可行

把第二维压去

dp[i] 表示 第1个人用时为i时,第2个人的最小用时

枚举第i个任务,枚举 当前第1个人用时为j

如果第1个人在j用时能做这个任务 那么

dp[j]=min(dp[j-timea[i]],dp[j]+timeb[i]) 即给第一个人做、第二个人做 取最优

如果第1个人在j用时不能做这个任务,那么只能给第2个人做

dp[j]+=timeb[i]

最后答案就是枚举所有的i,ans=min(max(i,dp[i]))

#include<cstdio>
#include<algorithm> #define N 1001 using namespace std; int n,a[N],b[N]; int front[N],nxt[N*N],to[N*N],tot,from[N*N]; int col[N],cnt;
int st[N],top;
int dfn[N],low[N],tim;
bool ins[N]; int in[N];
int na[N],nb[N]; int dp[]; void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u;
} void init()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
int x,y;
while(scanf("%d%d",&x,&y)!=EOF) add(x,y);
} void tarjan(int u)
{
dfn[u]=low[u]=++tim;
ins[u]=true; st[++top]=u;
for(int i=front[u];i;i=nxt[i])
if(!dfn[to[i]]) tarjan(to[i]),low[u]=min(low[u],low[to[i]]);
else if(ins[to[i]]) low[u]=min(low[u],dfn[to[i]]);
if(low[u]==dfn[u])
{
col[u]=++cnt; ins[u]=false;
na[cnt]=a[u]; nb[cnt]=b[u];
while(st[top]!=u)
{
na[cnt]=min(na[cnt],a[st[top]]);
nb[cnt]=min(nb[cnt],b[st[top]]);
col[st[top]]=cnt;ins[st[top--]]=false;
}
top--;
}
} void solve()
{
for(int i=;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=;i<=tot;i++)
if(col[from[i]]!=col[to[i]]) in[col[to[i]]]++;
int m=;
for(int i=;i<=cnt;i++)
if(!in[i]) m+=na[i];
for(int i=;i<=cnt;i++)
if(!in[i])
for(int j=m;j>=;j--)
if(j-na[i]>=) dp[j]=min(dp[j-na[i]],dp[j]+nb[i]);
else dp[j]+=nb[i];
int ans=m;
for(int i=m;i>=;i--) ans=min(ans,max(i,dp[i]));
printf("%d",ans);
} int main()
{
init();
solve();
}

codevs 1492 探案第二部的更多相关文章

  1. bgp选路原则【第二部】

    面向逻辑谈bgp选路原则(第二部) 终于到了BGP终极解析的第二部曲--BGP选路原则.与题目相呼应,我不会直接介绍选路原则的规则,而是从时间逻辑和空间逻辑上将所有的选路原则分层分类.因为只有从这种角 ...

  2. Swift Swift语言Storyboard教程:第二部

    本文由CocoaChina翻译小组@TurtleFromMars翻译自raywenderlich,原文:Storyboards Tutorial in Swift: Part 2 更新记录:该Stor ...

  3. tornado学习篇(第二部)

    执行字符串表示的函数,并为该函数提供全局变量 本篇的内容从题目中就可以看出来,就是为之后剖析tornado模板做准备,     #!usr/bin/env python #coding:utf-8 n ...

  4. Linux运维笔记--第二部

    第2部-重要目录结构详解 1.回顾Linux目录结构知识 /dev/            设备目录 /etc/             系统配置及服务配置文件,启动命令的目录 /proc       ...

  5. codevs——1700 施工方案第二季

    1700 施工方案第二季 2012年市队选拔赛北京  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description c国边防 ...

  6. Swift语言Storyboard教程:第二部

    本文由CocoaChina翻译小组@TurtleFromMars翻译自raywenderlich,原文:Storyboards Tutorial in Swift: Part 2 更新记录:该Stor ...

  7. codevs 1700 施工方案第二季

    1700 施工方案第二季 2012年市队选拔赛北京  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description c国边防 ...

  8. Python ( 高级 第二部)

    目录 模块和包 面向对象 部分一: 面向对象程序开发 面向对象封装: 对象的相关操作 面向对象封装: 类的相关操作 实例化的对象/ 定义的类删除公有成员属性和公有成员方法 部分二: 单继承 多继承 菱 ...

  9. A框架 第二部 实例化接收到的get类,调用父类抽象方法,自动执行方法call_user_func_array()

    01父类抽象类 abstract.php <?phpabstract class controller_abstract{ protected $app; function __construc ...

随机推荐

  1. 2017软工第十周个人PSP

    11.17--11.23本周例行报告 1.PSP(personal software process )个人软件过程. C(类别) C(内容) ST(开始时间) ET(结束时间) INT(间隔时间) ...

  2. Python学习之路6 - 装饰器

    装饰器 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能.原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器的知识储备: 1.函数即“变量” 2.高阶函 ...

  3. lintcode-473-单词的添加与查找

    473-单词的添加与查找 设计一个包含下面两个操作的数据结构:addWord(word), search(word) addWord(word)会在数据结构中添加一个单词.而search(word)则 ...

  4. EF 联合查询

    EF 文章表和标签表联合查询标签id在dis中的文章,还不知道性能如何 var query = tagRepo.Entities.Include("Tags").Where(t = ...

  5. elementUI使用本地变量进行验证,监测不到本地变量的变化 的问题

    对于饿了么组件自定义验证规则,组件库文档已经非常详细了:http://element-cn.eleme.io/#/zh-CN/component/form 我这里将验证中固定的值提取出来使用变量进行保 ...

  6. 剖析Vue原理&实现双向绑定MVVM-1

    本文能帮你做什么?1.了解vue的双向数据绑定原理以及核心代码模块2.缓解好奇心的同时了解如何实现双向绑定为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简化改造,相对较简陋,并未考 ...

  7. Socket 传一幅图片给另一个终端

    练习Socket传文件,先添加一个组件,简化socket发送和接收文件, 获取IP和端口的类 public static class AddressHelper { /// <summary&g ...

  8. FZU2121_神庙逃亡

    水题.直接解二次方程判断点的高度即可. #include <iostream> #include <cstring> #include <cstdio> #incl ...

  9. 【loj6342】跳一跳 期望dp

    题目描述 一个人从 $1$ 开始向 $n$ 跳,在 $i$ 时会等概率跳到 $i,i+1,...,n$ 之一.求从 $1$ 跳到 $n$ 的期望步数. $n\le 10^7$ . 题解 期望dp傻逼题 ...

  10. 【Java并发编程】之三:线程挂起、恢复与终止的正确方法

    挂起和恢复线程 ​ Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时), ...