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