您的位置:首页 > 其它

Process the Tasks(ZOJ3331)

2016-04-05 18:42 351 查看
题目链接:http://icpc.moe/onlinejudge/showProblem.do?problemCode=3331

题意:给两个机器,然后很多个操作,分别给出对应操作在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: