bzoj 1222: [HNOI2001]产品加工 dp

1222: [HNOI2001]产品加工

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 381  Solved: 218
[Submit][Status][Discuss]

Description


加工厂有A、B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所
需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。某一天,加工厂接到n个产品加工的任务,每个任务的工作量不尽一样。你的任务就是:
已知每个任务在A机器上加工所需的时间t1,
B机器上加工所需的时间t2及由两台机器共同加工所需的时间t3,请你合理安排任务的调度顺序,使完成所有n个任务的总时间最少。

Input


入共n+1行第1行为 n。
n是任务总数(1≤n≤6000)第i+1行为3个[0,5]之间的非负整数t1,t2,t3,分别表示第i个任务在A机器上加工、B机器上加工、两台机
器共同加工所需要的时间。如果所给的时间t1或t2为0表示任务不能在该台机器上加工,如果t3为0表示任务不能同时由两台机器加工。

Output

最少完成时间

Sample Input

5
2 1 0
0 5 0
2 4 1
0 0 3
2 1 1

Sample Output

9

HINT

Source

Dp

  dp[i]表示A机器用i分钟B机器最少用时

  这种dp方式也不是没有见过,但是遇到了就是想不到。

  还是不太熟悉。。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 31000
#define INF 0x3f3f3f3f
int dp[2][MAXN];

int main()
{
        freopen("input.txt","r",stdin);
        int n;
        scanf("%d",&n);
        memset(dp[0],INF,sizeof(dp[0]));
        dp[0][0]=0;
        for (int i=0;i<n;i++)
        {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                memset(dp[(i&1)^1],INF,sizeof(dp[0]));
                for (int j=0;j<=30000;j++)
                {
                        if (a)dp[(i&1)^1][j+a]=min(dp[(i&1)^1][j+a],dp[(i&1)][j]);
                        if (c)dp[(i&1)^1][j+c]=min(dp[(i&1)^1][j+c],dp[(i&1)][j]+c);
                        if (b)dp[(i&1)^1][j]=min(dp[(i&1)^1][j],dp[(i&1)][j]+b);
                }
        }
        int ans=INF;
        for (int j=0;j<=30000;j++)
                ans=min(ans,max(dp[n&1][j],j));
        printf("%d\n",ans);
}
时间: 2024-08-06 03:42:02

bzoj 1222: [HNOI2001]产品加工 dp的相关文章

bzoj 1222 DP

用w[i]表示在A中用了i的时间时在B中最少用多长时间,然后转移就可以了. 备注:这个边界不好定义,所以可以每次用一个cur来存储最优值,然后对w[i]赋值就可以了. /************************************************************** Problem: 1222 User: BLADEVIL Language: C++ Result: Accepted Time:2648 ms Memory:992 kb ***************

BZOJ 1087状态压缩DP

状态压缩DP真心不会写,参考了别人的写法. 先预处理出合理状态, 我们用二进制表示可以放棋子的状态,DP[I][J][K]:表示现在处理到第I行,J:表示第I行的状态,K表示现在为止一共放的棋子数量. #include<stdio.h> #include<iostream> #define N 1111 using namespace std; typedef long long ll; int num,n,m; ll dp[11][1<<11][90]; int hh

BZOJ 1237 配对(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1237 题意:给出两个n元素的数列A和B.为A中的每个元素在B中为其找一个配对的元素(配对的元素不能相等,B中每个元素只能被使用一次),使得所有配对的两个数的差的绝对值之和最小? 思路:首先排序,若无配对元素不能相等这一 限制,则排序后一一匹配即可.有了这个限制,那么对于相等的元素就要在其前后进行调整,显然,与距离较远的调整不如与距离近的调整优.那么,需要在多大的 范围内调整才能保证最优

bzoj 3437 斜率优化DP

写题解之前首先要感谢妹子. 比较容易的斜率DP,设sum[i]=Σb[j],sum_[i]=Σb[j]*j,w[i]为第i个建立,前i个的代价. 那么就可以转移了. 备注:还是要感谢妹子. /************************************************************** Problem: 3437 User: BLADEVIL Language: C++ Result: Accepted Time:3404 ms Memory:39872 kb **

【bzoj1222】[HNOI2001]产品加工 背包dp

题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同.某一天,加工厂接到n个产品加工的任务,每个任务的工作量不尽一样.你的任务就是:已知每个任务在A机器上加工所需的时间t1, B机器上加工所需的时间t2及由两台机器共同加工所需的时间t3,请你合理安排任务的调度顺序,使完成所有n个任务的总时间最少. 输入 输入共n+1行第1行为 n

【bzoj1222】[HNOI2001]产品加工

Description 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同.某一天,加工厂接到n个产品加工的任务,每个任务的工作量不尽一样.你的任务就是:已知每个任务在A机器上加工所需的时间t1, B机器上加工所需的时间t2及由两台机器共同加工所需的时间t3,请你合理安排任务的调度顺序,使完成所有n个任务的总时间最少. Input 输入共

[BZOJ 3791] 作业 【DP】

题目链接:BZOJ - 3791 题目分析 一个性质:将一个序列染色 k 次,每次染连续的一段,最多将序列染成 2k-1 段不同的颜色. 那么就可以 DP 了,f[i][j][0|1] 表示到第 i 个位置,染了 j 段,当前这一段颜色为 0|1 的最大价值. f[i][][] 只与 f[i-1][][] 有关,第一维用滚动数组就可以了. 代码 #include <iostream> #include <cstdio> #include <cstring> #inclu

[BZOJ 2165] 大楼 【DP + 倍增 + 二进制】

题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ,用状态 f[x][i][j] 表示从 i 出发,坐 x 次电梯到达 j ,最多能上升的层数.开始读入的就是 f[1][][] 数组.(注意:若开始时 i 不能走到 j , 则 f[1][i][j] = -INF) 使用倍增,用 f[x][][] 求出 f[x << 1][][] , 一直求f[2

BZOJ 1225: [HNOI2001] 求正整数( dfs + 高精度 )

15 < log250000 < 16, 所以不会选超过16个质数, 然后暴力去跑dfs, 高精度计算最后答案.. ------------------------------------------------------------------------------ #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace s