uvalive 4636(逻辑)

该博客分析了UVA 4636问题,涉及将等大的立方体堆叠成满足特定正视图和侧视图条件的结构。解题思路是首先在二维平面上考虑正视图和侧视图,正方形的数量对应立方体个数。若侧视图有新增列,则需额外添加立方体,否则可以通过平移视为同一列。最少的立方体数量为两个视图中正方形较多的视图数量,加上另一视图中未出现的列数。解决方案采用地图数据结构实现。
摘要由CSDN通过智能技术生成

题意:等大的立方体搭积木,每个立方体可以直接放在地上或放在另一个正方体的正上方,给出正视图和侧视图,问最少要用多少个正方体。

题解:可以先想如何形成正视图或侧视图,那么就是二维平面,正视图(侧视图)上有多少个正方形就是有多少个正方体,然后在这个基础上侧视图(正视图)如果出现新的列(之前视图不相等)的,就要新摆放一个,否则通过平移可以看做同一列,就不需要添加正方体了,那么可以得出,最少数量正方体就是正视图或侧视图中正方形多的那个视图,把它上面的正方形数量加上另一个视图上没有出现过的所有列就是最终解,用一个map就能解决。

#include <stdio.h>
#include <string.h>
const int N = 25;
int c, r, m[N], a1[N], a2[N];

int main() {
	while (scanf("%d%d", &c, &r) && c) {
		memset(m, 0, sizeof(m));
		int sum1 = 0, sum2 = 0;
		for (int i = 0; i < c; i++) {
			scanf("%d", &a1[i]);
			sum1 += a1[i];
		}
		for (int i = 0; i < r; i++) {
			scanf("%d", &a2[i]);
			sum2 += a2[i];
		}
		if (sum1 > sum2) {
			for (int i = 0; i < c; i++)	
				m[a1[i]]++;
			for (int i = 0; i < r; i++)
				if (!m[a2[i]])
					sum1 += a2[i];
				else
					m[a2[i]]--;				
			printf("%d\n", sum1);
		}
		else {
			for (int i = 0; i < r; i++)	
				m[a2[i]]++;
			for (int i = 0; i < c; i++)
				if (!m[a1[i]])
					sum2 += a1[i];
				else
					m[a1[i]]--;				
			printf("%d\n", sum2);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值