首页 > 其他分享 >题解 P2224 [HNOI2001]产品加工

题解 P2224 [HNOI2001]产品加工

时间:2022-10-20 11:55:47浏览次数:53  
标签:int 题解 t2 t3 t1 HNOI2001 时间 P2224 dp

一道很有趣的 dp 题。

这道题是以答案为下标来设定状态,在这种生产问题这个套路还是挺常见的,需要积累一下。

我们令 \(f_{i,j}\) 为前 \(i\) 个任务 \(A\) 机器花了\(j\) 时间的时候,\(B\) 机器花费的时间最少是多少。

所以答案就是 \(\min\{\max\{i,f_{n,i}\}\}\) 。我们对于每一个时间 \(i\) 所需要的总时间就是做完前 \(n\) 个任务 \(B\) 花费的时间和 \(A\) 花费的时间的最大值。由于我们枚举的 \(i\) 就是 \(A\) 花费的时间,所以只需与 \(f_{n,i}\) 取最大值即可。

转移可以考虑从三个方向转移过来,对于当前任务,我们分别考虑是 \(A\) 做,\(B\) 做,还是 \(A\) 和 \(B\) 一起做。

即可以推出转移方程。

\[f_{i,j}=\max\left\{\begin{array}{l}f_{i-1,j-t1_i}\\ f_{i-1,j}+t2_i\\ f_{i-1,j-t3_i}+t3_i \end{array}\right. \]

我们发现这样的空间开销是很大的,因为我们既要记录是哪个任务还要记录时间。

我们发现对于第 \(i\) 个任务只能从 \(i-1\) 这个任务转移过来,所以可以滚动数组。

还有一个关于枚举的时间的优化。不难发现,对于当前任务 \(i\) 的时间 \(j\),\(j\) 一定不会超过前 \(i-1\) 个任务所花的时间的最大值。

即 \(j\le \sum{\max(t1_i,t2_i,t3_i)}\) 。

细节不算多,但注意数组开大点,因为时间的大小比较玄学。


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e4+10;
int t1[N],t2[N],t3[N];
int n;
int dp[10][N];
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>t1[i]>>t2[i]>>t3[i];
	}
	int sum=0;
	memset(dp,0x3f,sizeof(dp));
	dp[0][0]=0;
	for(int i=1;i<=n;i++)
	{
		sum+=max(t1[i],t3[i]);
		memset(dp[i&1],0x3f,sizeof(dp[i&1]));
		for(int j=0;j<=sum;j++)
		{
			if(t2[i]!=0) dp[i&1][j]=min(dp[(i&1)^1][j]+t2[i],dp[i&1][j]);
			if(t1[i]!=0 and j-t1[i]>=0) dp[i&1][j]=min(dp[i&1][j],dp[(i&1)^1][j-t1[i]]);
			if(t3[i]!=0 and j-t3[i]>=0) dp[i&1][j]=min(dp[i&1][j],dp[(i&1)^1][j-t3[i]]+t3[i]);
		}
	}
	int ans=0x7fffffff;
	for(int i=0;i<=sum;i++)
	{
		ans=min(ans,max(i,dp[n&1][i]));
	}
	cout<<ans;
	return 0;
}

标签:int,题解,t2,t3,t1,HNOI2001,时间,P2224,dp
From: https://www.cnblogs.com/zplqwq/p/16809340.html

相关文章

  • 2017 ACM Arabella Collegiate Programming Contest div2的题,部分题目写个题解
    F.MonkeyingAround 维护点在多少个线段上​​http://codeforces.com/gym/101350/problem/F​​题意:有m个笑话,每个笑话的区间是[L,R],笑话种类有1e5,一开始所有猴子都在......
  • mysql函数 字符长度限制_MySQL中使用group_concat()函数数据字符过长报错的问题解决方
    selectGROUP_CONCAT(uid)asuids,spread_uidfromeb_user_spreadwhereuid<>spread_uidGROUPBYspread_uid使用GROUP_CONCAT函数将字符串连接起来,数据量大的时候,会......
  • CF 1012C. Hills 题解
    题目传送门:Link。算法:DP。设计状态第一眼看着道题就感觉像是DP,再观察数据范围大概是\(O(n^2)\)的时间复杂度。因为要求多个\(k\)的答案,那么状态第一维显然是令多......
  • 洛谷 P3224 [HNOI2012]永无乡 题解
    查询第\(k\)小值想到权值线段树。合并操作想到线段树合并。维护连通性想到并查集。并查集合并方向应与线段树合并方向一致。查询时,先求出并查集的根再在线段树上询......
  • 力扣_剑指Offer_个人题解day05
    day05剑指Offer04.二维数组中的查找题目描述:在一个n*m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的......
  • 力扣_剑指Offer_个人题解day03
    day03剑指Offer05.替换空格题目描述:请实现一个函数,把字符串s中的每个空格替换成"%20"。示例1:输入:s="Wearehappy."输出:"We%20are%20happy."限制:0<=s的长度......
  • 力扣_剑指Offer_个人题解
    day02剑指Offer06.从尾到头打印链表题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例1:输入:head=[1,3,2]输出:[2,3,1]限制:0<=链......
  • P2059 [JLOI2013] 卡牌游戏 题解
    一道不错的线性dp,带了点逆推。注意到如果我们设\(f_{i,j}\)表示前\(i\)轮过后\(j\)存活的概率,那么我们需要额外记录哪些人无了,否则无法转移。考虑这样一件事:无论......
  • tinymce粘贴word图片问题解决
    ​ 项目需求可发布文章需求涉及到富文本编辑器经过查阅我选择了较为简便不需要后端支持可独立完成的tinymce框架官方文档也是相当完整虽然都是全英文但是有强大的......
  • POJ 1389. Area of Simple Polygons 题解
    关于扫描线的介绍可以去看OIWiki。但那上面的参考代码并不好,下面给出了带注释的POJ1389题代码。/**Title:AreaofSimplePolygons*Source:POJ*URL:htt......