笔试题:堆积木(拼多多真题)

参考:CSDN牛客

题目描述

有N个积木,变长为Li,每个高度为1,每个重量为Wi
要求:

  1. 严格保证变长大的叠在边长小的上面
  2. 每个积木只能承受自身大小7倍以内的重量,所以其上所有积木重量综合不能超过这么多
  3. 问最高能搭多高的积木

测试用例

输入:
10 # 积木个数N
1 2 3 4 5 6 7 8 9 10 # 各积木边长
1 1 1 1 1 1 1 1 1 10 # 各积木重量

输出:
8 #最大高度

思路

  1. 首先对所有积木按照长度、重量从小到大排序;
  2. 使用动态规划,dp[i][h]记录以第i块积木为底, 高为h的积木塔的最低重量。
  3. 寻找以i为底、高度为j的最低重量,需要遍历[0, … , i-1]为底、高度为j-1已求解的dp[j][h-1],进行更新

C++代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct Block
{	
	int length;
	int weight;
	Block(): length(0), weight(0) {}
};
bool cmp(const Block &a, const Block &b)
{
 	if (a.length != b.length)//长度从小到大排序
 	{
  		return a.length < b.length;
 	}
	else//长度相等的,按重量从小到大排序
	{
  		return a.weight < b.weight;
	}
}

int main()
{
 	int N;
	int l, w;
	cin >> N;
	vector<Block> myBlocks(N);
	for (int i = 0; i < N; i++)
 	{
		cin >> l;
		myBlocks[i].length = l;
	}
	 for (int i = 0; i < N; i++)
	 {
	  cin >> w;
	  myBlocks[i].weight = w;
	 }
	 //所有积木按照长度、重量从小到大排序
	 sort(myBlocks.begin(), myBlocks.end(), cmp);
 
	 int maxHeight = 1;
	 //dp[i][h]记录以第i块积木为底, 高为h的积木塔的最低重量。
	 vector<vector<int>> dp(N, vector<int>(N+1, -1));
	 dp[0][1] = myBlocks[0].weight;
	 for (int i = 1; i < N; i++)
	 {
		dp[i][1] = myBlocks[i].weight;
		for (int h = 2; h <= N; h++)//寻找以i为底、高度为j的最低重量
		{ 
		    //需要遍历[0, ... , i-1]为底、高度为j-1已求解的dp[j][h-1],进行更新
		    for (int j = i - 1; j >= 0; j--)
		    {
		        if (dp[j][h - 1] != -1 && 7 * myBlocks[i].weight >= dp[j][h - 1]
		       && (dp[i][h] == -1 || myBlocks[i].weight + dp[j][h - 1] < dp[i][h]))
		      {
			maxHeight = max(maxHeight, h);
			dp[i][h] = myBlocks[i].weight + dp[j][h - 1];
		      }
		   }
	        }
	}
	cout << maxHeight << endl;
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值