首页 > 其他分享 >2023CCPC华为云挑战赛 C-装箱问题

2023CCPC华为云挑战赛 C-装箱问题

时间:2023-08-21 20:13:57浏览次数:45  
标签:箱子 容量 dpp int 2023CCPC 体积 物品 挑战赛 装箱

题目链接

     题意 : 有体积分别为x和y的物品以及n个空的箱子,第i个箱子有着bi的容量,先试图用这些箱子装物品,使装的物品总体积不小于r,同时对于每个箱子装完物品后的剩余容量Ci,希望求出箱子装完至少r体积物品后,所有箱子剩余体积Ci的平方和,可以取到的最大值是多少?如果用所给的箱子不能装下r体积的物品,则直接输出-1。

     解题思路: 因为只有x和y这两种体积的物体,同时每个箱子的容量都已知,数据范围也较小(都是不超过100),所以可以很方便的求出每个箱子能够容纳多少体积的物体,为了保证最终所求值较小,我们要使得所有箱子存放的物品容量在满足r的情况下尽可能小,因此当前箱子具体装多少对于后面箱子的存放存在干扰,采用动态规划(dp)的方式来解决最合适不过,我们设 dp[i][j] 代表第i个箱子存放j容量大小的物品需要多少个x y物品(其实就是判断这个箱子能否容纳这个体积的物品), 再用 dpp[i][j]表示前i个箱子被用于存放物品后,当前已存入j体积物品时的剩余体积平方和,那么自然dpp[i][0]的初始值就是所有物品容量的平方和,之后分别用num , j ,i顺序遍历r n 和 bi,确定在当前存放容量为num时,第j个箱子存放了体积和为i的物品后,此刻剩余容量和的最大值,关于递推式,我们容易判断当一个箱子容量为7时,还未放入任何物品的它将为答案贡献7*7的数值,而在它被放入2体积物品后,贡献值变成5*5,相较之前减少了(7*7) - (5*5) = 24 ,因此我们分析后的递推式将是dpp[j][num + i] = max(dpp[j][num+i] ,  dpp[j - 1][num] - (b[j]*b[j] -  ( (b[j] - i)*(b[j] - i) ) ) ) ,最终所求答案将是dpp[n][r],此外要判断这个值是否为负数,若是,说明我们达不到存放r体积物品的条件,直接输出“-1”即可,否则则直接输出该值即可。

 

AC代码
 #include<bits/stdc++.h>
#define int long long
using namespace std;
#pragma GCC optimize(3)
#pragma GCC optimize(2)
const int mod = 1e18;
const int inf = 1e10;
typedef long long ll;

int T , n , x , y , r , sum = 0;
int b[105];
int dpp[101][10001];
int dp[105][105];

signed main() {
	//ios::sync_with_stdio(0);
	//cin.tie(0);
	//cout.tie(0);
	//cin >> T;
	scanf("%lld" , &T);
	while(T--) {
		scanf("%lld %lld %lld %lld" , &n , &x , &y , &r);
		sum = 0;
		for(int j = 1 ; j <= n ; j++){
			scanf("%lld" , &b[j]);
			sum += (b[j]*b[j]);//计算容量平方和
		}
		sort(b+1 , b+1+n);
		for(int j = 1 ; j <= 100 ; j++){
			dp[j][0] = 0;
			for(int i = 1 ; i <= 100 ; i++){
		    	dp[j][i] = mod;
		    }
		}
		for(int j = 1 ; j <= n ; j++){//计算每个箱子能够容纳多少体积的物品
			for(int i = 0 ; i <= b[j] ; i++){
				if(i + x <= b[j]){
				   dp[j][i + x] = min(dp[j][i + x] , dp[j][i] + 1);
				}
				if(i + y <= b[j]){
					dp[j][i + y] = min(dp[j][i + y] , dp[j][i] + 1);
				}
			}
		}
		for(int i = 0 ; i <= n ; i++){
			dpp[i][0] = sum;
			for(int j = 1 ; j <= r ; j++){
			  dpp[i][j] = -inf;//初始化,除了不存放外,其他情况都先定义为极小值。
		   }
		}
		for(int num = 0 ; num <= r ; num++){
		   for(int j = 1 ; j <= n ; j++){
		    	for(int i = 0 ; i <= b[j] ; i++){
				  if(dp[j][i] != mod){//保证这个物品可以存放i体积的物品
				  	if( num + i <= r ){//要注意加上这个存入量后是否超过r,超过r就直接对dpp[j][r]更新即可
				  		dpp[j][num + i] = max(dpp[j][num+i] ,  dpp[j - 1][num] - (b[j]*b[j] -  ( (b[j] - i)*(b[j] - i) )));
					}
					else{
						dpp[j][r] = max(dpp[j][r] ,  dpp[j - 1][num] - (b[j]*b[j] -  ( (b[j] - i)*(b[j] - i) )));
					}
				  }
				  else{
				  	continue;
				  }
			   }
	        } 
	    } 
		if(dpp[n][r] < 0){//判断能否满足题目要求,不能则输出-1
			cout<<"-1\n";
		}
		else{
			cout<<dpp[n][r]<<"\n";
		}
	}

	return 0;
}

 

 

标签:箱子,容量,dpp,int,2023CCPC,体积,物品,挑战赛,装箱
From: https://www.cnblogs.com/lianggongjing/p/17645486.html

相关文章

  • AI夏令营第三期 - 脑PET图像分析和疾病预测挑战赛
    Log<第一次更新>2023.8.1822:10Backgound赛事任务为研究基于脑PET图像的疾病预测,本次大赛提供了海量脑PET数据集作为脑PET图像检测数据库的训练样本,参赛者需根据提供的样本构建模型,对轻度认知障碍进行分析和预测。脑PET图像检测数据库,记录了老年人受试志愿者的脑PET影像......
  • 【喜报】我室副室长我是大都督在全国青少年人工智能创新挑战赛的无人驾驶智能车专项赛
    【喜报】我室副室长我是大都督在全国青少年人工智能创新挑战赛的无人驾驶智能车专项赛中荣获第一名的佳绩!我室副室长我是大都督在全国青少年人工智能创新挑战赛的无人驾驶智能车专项赛中展现出色的实力,成功夺得了第一名的殊荣!他的卓越表现和卓越技术为我们所有人带来了巨大的骄傲......
  • TinyMind第一届汉字书法识别挑战赛
    报名地址:http://www.tinymind.cn/competitions/41?from=blog比赛介绍手写字体识别一直是人工智能领域一个热门研究方向,这次我们联合书法领域的权威合作伙伴举办这次书法字体识别大赛,给广大人工智能和手写字体识别技术爱好者提供一个练习和交流的机会,也希望能通过这次比赛发现一些......
  • Java 自动装箱与拆箱实战
    什么是自动装箱拆箱?很简单,下面两句代码就可以看到装箱和拆箱过程//自动装箱Integertotal=99;//自动拆箱inttotalprim=total;简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。下面我们来看看需要装箱拆箱的类型有哪些:这......
  • 记一次体验愉快的GameJam|上交复旦x72h极限游戏开发挑战赛
    太长不看版【上交复旦x72h极限游戏开发挑战赛作品《Colorful》宣传短片】 【腾讯×上交复旦72hgamejam极限游戏开发挑战赛作品《Colorful》全流程演示】 试玩demo下载链接:https://pan.baidu.com/s/1Xdksy97qF8Qac31H6nUGww 提取码:wmuq游戏简介:你说得对,但是《卡乐芙(col......
  • 阿里云联合浙江大学举办首届数智服务创新挑战赛!
     Datawhale 举办方:阿里云,浙江大学,阿里巴巴达摩院9月17日,阿里巴巴集团副总裁,阿里云智能全球技术服务部总经理李津在2020云栖大会技术服务分论坛上,宣布启动首届阿里云数智服务创新挑战赛。此次大赛由阿里云、浙江大学、阿里巴巴达摩院、天池平台联合举办。作为全球前三的云计算及人......
  • 【参赛有奖】云原生编程挑战赛·赛道 2 邀你来战!
    第四届云原生编程挑战赛,是由阿里云主办,云原生应用平台、天池联合承办的云原生著名品牌赛事。自2015年开始,大赛已经成功举办了八届,并从2020年开始升级为首届云原生编程挑战赛,共吸引了超过53000支队伍,覆盖10余个国家和地区。本届大赛将深度探索Serverless、容器、微服务三......
  • DASCTF 2023 & 0X401七月暑期挑战赛
    比赛只出了一道,小菜不是罪过-_-controlflow这个题动调到底就行foriinrange(40):after_xor[i]=inp[i]^0x401after_xor[i]+=i*i;foriinrange(11,30,1):x=i-10after_xor[i]^=x*(x+1)foriinrange(40):after_xor[i]-=iafter_xo......
  • DASCTF 2023 & 0X401七月暑期挑战赛——— 解析viphouse
    DASCTF2023&0X401七月暑期挑战赛———解析viphouse保护策略静态分析main  主函数在while循环提供了一个菜单。void__fastcall__noreturnmain(__int64a1,char**a2,char**a3){charnptr[10];//[rsp+Eh][rbp-12h]BYREFunsigned__int64v4;//[rsp......
  • 集装箱多式联运——动态规划
    物流运输方式由公路、铁路、水路、空运及管道等5种方式组成,5种运输方式在技术上、经济上各有长短,都有适宜的使用范围,每种运输方式单独运用很难实现节约资源、降本增效。随着我国经济不断发展以及布局网络技术的不断深化,多式联运通过把传统的、单一的运输方式进行择优组合,充分利......