Process the Tasks(ZOJ3331)
2016-04-05 18:42
351 查看
题目链接:http://icpc.moe/onlinejudge/showProblem.do?problemCode=3331
题意:给两个机器,然后很多个操作,分别给出对应操作在AB两个机器上运作的时间,限定该操作能执行的条件是,前一个操作已完成或正在执行.
/article/7581455.html
第一次接触双塔dp代码是别人教的。
说真的自己到现在还看不怎么懂。还需要多多努力,但是先保留下来以后自己慢慢补。
题意:给两个机器,然后很多个操作,分别给出对应操作在AB两个机器上运作的时间,限定该操作能执行的条件是,前一个操作已完成或正在执行.
/article/7581455.html
第一次接触双塔dp代码是别人教的。
说真的自己到现在还看不怎么懂。还需要多多努力,但是先保留下来以后自己慢慢补。
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f int dp[105][200];//前i个任务,两个机器的时差,也就是双塔高度差a-b int ta[105],tb[105]; int n,t; int main() { cin>>t; while(t--) { int offset=100; //因为差值可能是负数,因此需要加一个偏移量保证差值为正数 cin>>n; for(int i=1;i<=n;i++) cin>>ta[i]>>tb[i]; for(int i=0;i<=n;i++) for(int j=0;j<=200;j++) dp[i][j]=inf; dp[0][0+offset]=0; for(int i=1;i<=n;i++){ for(int j=-99;j<=99;j++){ if(dp[i-1][j+offset]==inf) continue; if(j<0){//B塔较高 dp[i][-tb[i]+offset]=min(dp[i][-tb[i]+offset],dp[i-1][j+offset]+tb[i]); dp[i][j + ta[i] + offset] = min(dp[i][j + ta[i] + offset],dp[i - 1][j + offset] + max(0,j + ta[i])); } else //A塔较高 同理 { dp[i][ta[i] + offset] = min(dp[i][ta[i] + offset], dp[i - 1][j + offset] + ta[i]); dp[i][j - tb[i] + offset] = min(dp[i][j - tb[i] + offset], dp[i - 1][j + offset] + max(0,tb[i] - j)); } } } int ans = inf; for (int i = -99; i <= 99; i++) ans = min(dp [i + offset],ans); cout << ans << endl; } return 0; }
相关文章推荐
- 第五周第二项目——游戏角色设计
- Nodejs in Visual Studio Code 04.Swig模版
- 数位DP 水~
- BootStrap之基础-3 组件
- 游戏中的角色类1
- 使用TinyXml对XML进行遍历
- Open Investor简介
- 2016 腾讯笔试题 最长回文字串(不连续)(dp)
- http和socket之长连接和短连接区别
- KMP算法(c++)实现
- js事件详解——事件流,事件处理,事件对象
- 俄罗斯Mail.Ru云端部署视频的技术架构解析
- [leetcode-331]Verify Preorder Serialization of a Binary Tree
- 项目4-静态成员应用
- struts2框架之struts框架介绍
- Uva10082 WERTYU -S.B.S.
- 读《构建之法》第四章有感
- C++ 流以及文件操作
- tcp socket阻塞与非阻塞
- 三剑客之awk basic