算法竞赛入门经典(第二版) | 习题3-10 盒子 (pair结构体)(UVa1587,Box)

大意:

给定6个矩形的长和宽,判断他们能否构成一个长方体。


题目(提交)链接→UVa-1587
没使用过该网站的同学请猛戳这里→vJudge教程


储备知识:

pair结构体:
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map,就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候
,可以选择pair。
简而言之:就是封装好的结构体(只能是二变量)

分析:

最初的思路是:
先判断输入的数呈三对,找出每对中的一个面(共三个面),每个面的每条边都会出现在另外两个面其中之一。
优化的思路是:
用pair结构体存储一个面的两个边,而后排序,按升序排好的长方体,第一个变量的最小值必然等于接下来三个变量的最小值;第一个变量的最大值必然等于最后两个变量的最小值 ;第三个变量的最大值必然等于第四、五、六个变量的最大值。
例如(下面是排好序的六个变量):
6 13
6 13
6 25
6 25
13 25
13 25

输入输出格式:

1、EOF结束
2、每个输出结果间没有空格

代码(15\16\17行为核心代码):

#include <iostream>
#include <cstdio>
#include <algorithm> 
using namespace std;
pair <int,int> p[6];
int i;
int main() {
	while(1) {
		for(int i = 0; i < 6; i++) {
			if(!(cin>>p[i].first>>p[i].second)) return 0;
			if(p[i].first > p[i].second) 
				swap(p[i].first, p[i].second);
		}
		sort(p, p+6); //按照首先first递增,其次second递增排序
		puts(p[0].first==p[1].first&&p[0].first==p[2].first&&p[0].first==p[3].first&&	
		p[2].second==p[3].second&&p[2].second==p[4].second&&p[2].second==p[5].second&&	
		p[0].second==p[1].second&&p[0].second==p[4].first&&p[0].second==p[5].first ? "POSSIBLE" : "IMPOSSIBLE") ;
	}
	return 0;
}  

收获:

1、pair结构体的用法
2、puts不需要加换行符,因为本就是一行一行输出
3、长方体的规则:按升序排好的长方体,第一个变量的最小值必然等于接下来三个变量的最小值;第一个变量的最大值必然等于最后两个变量的最小值 ;第三个变量的最大值必然等于第四、五、六个变量的最大值。
4、此种题:找技巧,后暴力枚举

思考:

本来是一道水题,但笔者太急于求成,总是想着怎样走捷径、找最优解法,却没有踏踏实实的想思路,写代码。因此耗费了很多时间.
静心思考后发现,笔者本末倒置了,拿到题首先要做的是将题做对,而后才可以交流经验,谋求更优化的解法。

发布了73 篇原创文章 · 获赞 61 · 访问量 4770

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104495479