首页 > 其他分享 >洛谷P2224产品加工(DP)

洛谷P2224产品加工(DP)

时间:2024-10-10 21:25:30浏览次数:1  
标签:tmp 机器 加工 int maxt 任务 洛谷 P2224 DP

[HNOI2001] 产品加工

题目描述

某加工厂有 A、B 两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。

某一天,加工厂接到 \(n\) 个产品加工的任务,每个任务的工作量不尽一样。

你的任务就是:已知每个任务在 A 机器上加工所需的时间 \(t_1\),B 机器上加工所需的时间 \(t_2\) 及由两台机器共同加工所需的时间 \(t_3\),请你合理安排任务的调度顺序,使完成所有 \(n\) 个任务的总时间最少。

输入格式

第一行为一个整数 \(n\)。

接下来 \(n\) 行,每行三个非负整数 \(t_1,t_2,t_3\),分别表示第 \(i\) 个任务在 A 机器上加工、B 机器上加工、两台机器共同加工所需要的时间。如果所给的时间 \(t_1\) 或 \(t_2\) 为 \(0\) 表示任务不能在该台机器上加工,如果 \(t_3\) 为 \(0\) 表示任务不能同时由两台机器加工。

输出格式

仅一行一个整数,表示完成所有 \(n\) 个任务的最少总时间。

关于本题:

也是头一次见这种状态定义方式比较特殊的,我们发现对于任务排序不太好做,考虑dp,那么状态的设计呢

Sol:

(1).f[i][t1][t2]:表示前i个任务,A用时t1,B用时t2是否可行
我们发现maxt大约在6000*5=30000,空间时间都不允许,考虑降维

(2).f[i][t1]:表示前i个任务,A用时t1,B的最小用时,这一步是把B的状态取消固定
但是此时发现空间为 6000*30000=180000000=1.8 * 10^8,MLE

(3).转移时发现f[i]之和f[i-1]有关,滚动一下就行了

滚动后记得数组赋初始值,然后你就要用memset每次对f[last]这一行赋值了对吗?你会TLE得理所应当。
原因是多次调用memset使程序效率降低,那我们干脆就用临时变量算了,由于再滚动了一维,所以maxt要倒序枚举

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
const int N=3e5+7;
int n,ans=0x3f3f3f3f,s;
int x,y,z,maxt;
int f[N];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>x>>y>>z;
		maxt+=max(max(x,y),z);
		for(int j=maxt;j>=0;j--){
			int tmp=0x3f3f3f3f;
			if(x&&j>=x) tmp=min(tmp,f[j-x]);
			if(y) tmp=min(tmp,f[j]+y);
			if(z&&j>=z) tmp=min(tmp,f[j-z]+z);
			f[j]=tmp;
		}
	}
	for(int i=0;i<=maxt;++i)
		ans=min(ans,max(i,f[i]));
	cout<<ans<<'\n';
	return 0;
}


样例 #1

样例输入 #1

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

样例输出 #1

9

提示

对于所有数据,有 \(1\le n\le 6\times 10^3\), \(0\le t_1,t_2,t_3\le 5\)。

标签:tmp,机器,加工,int,maxt,任务,洛谷,P2224,DP
From: https://www.cnblogs.com/vicem/p/18457168

相关文章

  • 洛谷P4074糖果公园(带修莫队)
    [WC2013]糖果公园题目描述Candyland有一座糖果公园,公园里不仅有美丽的风景、好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩。糖果公园的结构十分奇特,它由\(n\)个游览点构成,每个游览点都有一个糖果发放处,我们可以依次将游览点编号为\(1\)......
  • 洛谷 P7517 [省选联考 2021 B 卷] 数对
    题目传送门解题思路其实你只要知道:这题你就秒了。我们发现 ,于是开一个桶来统计每个数出现的数量。我们只需要枚举每一个数的倍数,然后统计。最后,如果一个数出现了多次,再特判一下即可。代码#include<bits/stdc++.h>usingnamespacestd;intn;intcnt[500001];......
  • 洛谷题单指南-字符串-P2580 于是他错误的点名开始了
    原题链接:https://www.luogu.com.cn/problem/P2580题意解读:给n个字符串,再依次处理m个字符串,对于每个字符串,如果在前面n个字符串中输出OK,如果不在n个字符串中输出WRONG,如果在n个字符串中且不止一次查询过输出REPEAT。解题思路:1、set/map方法很简单直接,用set存下前n个字符串,map......
  • 洛谷题单指南-字符串-P1481 魔族密码
    原题链接:https://www.luogu.com.cn/problem/P1481题意解读:在n个字符串中找到最长的词链长度,定义字符串a、b、c可以形成词链,即a是b的前缀、b是c的前缀。解题思路:1、Trie树定义Trie树,也称前缀树、字典树,核心思想是将字符串拆解为单个字符,每个字符是树的一条边,节点是字符添加到树......
  • 【做题笔记】Atcoder 之 dp 专题训练
    ABCDEFGHI概率dp。设\(dp_{i,j}\)表示前\(i\)个硬币中有\(j\)个正面的概率。转移显然:\(dp_{i,j}=dp_{i-1,j-1}\timesp_i+dp_{i-1,j}\times(1-p_i)\)当\(j=0\)时,前\(i\)个硬币中没有正面。所以只能由反面的概率转移过来,转移为:\(dp_{i,j}=dp_{i-1,j}\time......
  • E62 树形DP P8677 [蓝桥杯 2018 国 A] 采油
    视频链接:  P8677[蓝桥杯2018国A]采油-洛谷|计算机科学教育新生态(luogu.com.cn)//树形DP+贪心O(nlogn)#include<bits/stdc++.h>#defineN100010usingnamespacestd;vector<int>e[N];intn,B[N],S[N],f[N],len;structman{intb,s;};boolcmp(manx,......
  • 洛谷题单指南-字符串-P4391 [BOI2009] Radio Transmission 无线传输
    原题链接:https://www.luogu.com.cn/problem/P4391题意解读:s1由若干个s2组成,求s2的最小长度,注意题目中说明s1是子串,但是不影响,可以认为s1是补全的由若干s2组成的字符串。解题思路:设s1由x个s2组成,如图所示设s1的Next数组从0开始,那么其最长相同前后缀长度为x-1个s2,即Next[s1.siz......
  • 洛谷P3258 [JLOI2014] 松鼠的新家
    Problem给定一棵树,再给出其在树上的移动顺序,从\(a_1\)开始,在\(a_n\)结束,求出每个节点最少需要经过多少次(终点即\(a_n\)的最后一次到达不算)。其中\(n\le3\times10^5\),\(1\lea_i\len\)且保证a是1~n的排列Solve不难想到最少遍历的次数就是全走最短路,而一棵树中u->v的最短......
  • 树形DP问题归纳总结
    树形dp一般的状态定义方式:f[u][j]:所有只在以u为根的子树中选,且总体积不超过j的选法的集合题目1:树的最长路径最长路径也就相当于树的最大直径给定一棵树,树中包含n个结点(编号1~n)和n−1条无向边,每条边都有一个权值。现在请你找到树中的一条最长路径。换句话说,要找到一......
  • 区间DP问题归纳总结
    常见问题:常用技巧:将环形区间转变为线形区间,从而解决环形区间的问题区间dp记录方案数区间dp和高精度的结合(将高精度模板结合到dp中去)代码的实现方式有两种:迭代式:自底向上递推计算,适用于简单的dp过程,一般来说,状态用了几维,就需要写几层for循环,当dp维度较高时显然不适用......