首页 > 其他分享 >SP181 SCUBADIV - Scuba diver 题解

SP181 SCUBADIV - Scuba diver 题解

时间:2023-04-02 09:01:23浏览次数:46  
标签:氧气 气缸 int 题解 ri -- SCUBADIV 氮气 Scuba

题目传送门

题目大意

潜水员有 \(n\) 个气缸,每个气缸能够提供容量为 \(o_i\) 的氧气和容量为 \(d_i\) 的氮气,每个气缸的重量为 \(w_i\)。

给出潜水员所需要的氧气量和氮气量,求所需气缸的总重的最低限度是多少。

解题思路

对于每个气缸,有两种不同的费用:氧气和氮气,需要满足这两个条件,才能得到价值,也就是气缸的重量;所以可以看作是二维费用的背包问题。

将每个气缸的质量看做物品,把气缸的总重的最低限度看做背包。

枚举每个气缸,每次做二维费用的背包,如果当前的氧气或氮气超过了所需要的氧气或氮气,可以直接用需求量代替。

二维费用的背包:

划分阶段:

  • 以当前的氧气瓶为阶段;

状态表达:

  • 设 \(f_{i,j}\) 表示当所需的氧气量为 \(i\),氮气量为 \(j\) 的时候气缸的最小重量;

状态转移:

  • 当不选第 \(i\) 个气缸时,不变,\(f_{j,k}=f_{j,k}\);

  • 当选第 \(i\) 个气缸时,减去当前的氧气和氮气,加上质量,\(f_{j,k}=f_{j-o_i,k-d_i}+w_i\);

  • 这里注意,当 \(j-o_i\) 或 \(k-d_i\) 小于零时,也就是选中当前的氧气和氮气后还有剩余的氧气和氮气,这种情况可以直接用 \(j\) 或 \(k\),所以可以特判一下,如果 \(j-o_i\) 或 \(k-d_i\) 小于零,\(j-o_i\) 或 \(k-d_i\) 等于 \(0\)。

初始状态:

  • 因为当所需的氧气量为 \(0\),氮气量为 \(0\) 的时候气缸的最小重量也是 \(0\),所以 \(f_{0,0}=0\);要取最小值,所以其余全部为 \(INF\);

求解目标:\(f_{n,m}\);

代码

最后输出不加换行会 WA!

AC 记录

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int INF=0x3f;
int q;
int main() {
	cin>>q;
	while(q--) {
		int n,m,idx;
		cin>>n>>m>>idx;
		int o[1005],d[1005],w[1005],f[25][80];
		for(ri i=1; i<=idx; i++)
			cin>>o[i]>>d[i]>>w[i];
		memset(f,INF,sizeof(f));
		f[0][0]=0;//初始状态
		for(ri i=1; i<=idx; i++)//阶段
			for(ri j=n; j>=0; j--)//氧气
				for(ri k=m; k>=0; k--) {//氮气
					int x=j-o[i],y=k-d[i];
					if(x<0)x=0;
					if(y<0)y=0;
					f[j][k]=min(f[j][k],f[x][y]+w[i]);
				}	
		cout<<f[n][m]<<'\n';//求解目标
	}
	return 0;
}

标签:氧气,气缸,int,题解,ri,--,SCUBADIV,氮气,Scuba
From: https://www.cnblogs.com/zzyblog0619/p/17279902.html

相关文章

  • 一篇关于异或操作的题解 (来源:杭电oj: find your present (2))
    害惭愧惭愧老长时间没写代码了——————————转回正题,对于杭电这个题先说我超时的错误想法—————————————————————————————————————————————————————————————— 一开始我的想法是开一个大小为100000......
  • [省选联考 2023]D1 题解
    D1T1P9166火车站观察题目,联系到以前做过的一些区间dp可以发现如果小A可以去到(这里是去到而不是最终停在)\(k\)地点,那么\(x\)到\(k\)之间的所有地点他都可以去到,因为火车是连续的,不能跳着走,要来到当前地点必须到过路途中的所有节点。这样子就好办了,分两次处理往左边和......
  • P6146 [USACO20FEB]Help Yourself G 题解
    题目链接先按左端点从小到大排序。设\(f(i)\)表示前\(i\)条线段的所有子集的复杂度之和。考虑从\(f(i-1)\)转移到\(f(i)\),即考虑新加进来第\(i\)条线段的过程。第\(i\)条线段加进来所新产生的贡献分两种:设除了第\(i\)条线段选中的线段集合为\(S\),则若\(S\)......
  • # P4391 [BOI2009]Radio Transmission 无线传输 题解
    [BOI2009]RadioTransmission无线传输题目描述给你一个字符串\(s_1\),它是由某个字符串\(s_2\)不断自我连接形成的(保证至少重复\(2\)次)。但是字符串\(s_2\)是不确定的,现在只想知道它的最短长度是多少。输入格式第一行一个整数\(L\),表示给出字符串的长度。第二行给出......
  • 4.1 模拟赛题解
    A一模一样讲过B先做一遍前缀和将区间和转成两数之差的形式。cdq分治,递归时排好序。按顺序枚举左端点,合法的右端点区间单调移动。CIDA*,容易发现每次翻转并不会打乱中间的铁盘,只会改变下边界的相邻关系。最终顺序相邻两个铁盘大小相差均为\(1\),所以估价函数设为已操作次数......
  • 使用 IntelliJ IDEA 构建 Spring Framework 5.3.21 源码问题解决
    源码版本1、下载地址:https://github.com/spring-projects/spring-framework/tags2、选择要构建的源码版本并下载,例如:5.3.21相关环境1、操作系统:Windows102、JDK版本:Jdk173、IDE工具:IntelliJIDEA2021.3.34、项目构建工具:Gradle7.3.3使用IntelliJIDEA构建Spring......
  • CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!)(CF1810)A~D题题解
    今天采用的是新格式。CF1810ABeautifulSequence点击查看原题点击查看思路如果一个数字的值\(v\),不大于当前的位置\(p\),那我们可以通过删除\(p-v\)个数字,使它们两个对应上。比如\([1,7,2,5,3]\)中的\(3\),其数值为\(3\),位置为\(5\),数值\(3\)小于等于\(......
  • CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!) A-D题解
    题目地址A-BeautifulSequence题意:给出一个数组,问是否存在任意一个子区间,存在i,使得ai=iSolution直接比较当前的数和i的大小就行了,当前为x,如果要求答案存在,必须有i>=xvoidsolve(){ intn;cin>>n; intflag=0; for(inti=1;i<=n;i++) { intx;cin>>x; if(i>=x) {......
  • Thinkpad T14升级Windows11ver22h2失败问题解决小记
    背景手头的ThinkPad在近一年的时间里每次升级Windows11的22h2版本每次都会报错,具体有以下几种情况:更新过程中无问题,重启后黑屏更新过程中会卡在26%左右,然后蓝屏报KENERAL_CHECK_FAIL,接着便自动重启进入修复程序在WindowsUpdate更新中报错0xC1900101在上述错误出现后,再次更......
  • 使用 wine 安装微信遇到的问题解决方法
    1.中文显示成方块添加启动环境变量:LANG=zh_CN.UTF-82.输入框不显示文字安装winetrickssudoaptinstallwinetricks#oryay-Sywinetricks然后安装riched20winetricksriched20......