Process the Tasks(ZOJ3331)

54 篇文章 0 订阅
9 篇文章 0 订阅

题目链接:http://icpc.moe/onlinejudge/showProblem.do?problemCode=3331

题意:给两个机器,然后很多个操作,分别给出对应操作在AB两个机器上运作的时间,限定该操作能执行的条件是,前一个操作已完成或正在执行.

http://blog.csdn.net/loy_184548/article/details/50733395

第一次接触双塔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[n][i + offset],ans);
        cout << ans << endl;
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值