算法竞赛入门经典(第二版) | 习题3-10 盒子 (pair结构体)(UVa1587,Box)
大意:
給定6個矩形的長和寬,判斷他們能否構(gòu)成一個長方體。
題目(提交)鏈接→UVa-1587
沒使用過該網(wǎng)站的同學(xué)請猛戳這里→vJudge教程
儲備知識:
pair結(jié)構(gòu)體:
pair是將2個數(shù)據(jù)組合成一組數(shù)據(jù),滿足這個條件時就可以使用pair,如stl中的map,就是將key和value放在一起來保存。另一個應(yīng)用是,當(dāng)一個函數(shù)需要返回2個數(shù)據(jù)的時候,可以選擇pair。
簡而言之:就是封裝好的結(jié)構(gòu)體(只能是二變量)
分析:
最初的思路是:
先判斷輸入的數(shù)呈三對,找出每對中的一個面(共三個面),每個面的每條邊都會出現(xiàn)在另外兩個面其中之一。
優(yōu)化的思路是:
用pair結(jié)構(gòu)體存儲一個面的兩個邊,而后排序,按升序排好的長方體,第一個變量的最小值必然等于接下來三個變量的最小值;第一個變量的最大值必然等于最后兩個變量的最小值 ;第三個變量的最大值必然等于第四、五、六個變量的最大值。
例如(下面是排好序的六個變量):
6 13
6 13
6 25
6 25
13 25
13 25
輸入輸出格式:
1、EOF結(jié)束
2、每個輸出結(jié)果間沒有空格
代碼(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結(jié)構(gòu)體的用法
2、puts不需要加換行符,因為本就是一行一行輸出
3、長方體的規(guī)則:按升序排好的長方體,第一個變量的最小值必然等于接下來三個變量的最小值;第一個變量的最大值必然等于最后兩個變量的最小值 ;第三個變量的最大值必然等于第四、五、六個變量的最大值。
4、此種題:找技巧,后暴力枚舉
思考:
本來是一道水題,但筆者太急于求成,總是想著怎樣走捷徑、找最優(yōu)解法,卻沒有踏踏實實的想思路,寫代碼。因此耗費了很多時間.
靜心思考后發(fā)現(xiàn),筆者本末倒置了,拿到題首先要做的是將題做對,而后才可以交流經(jīng)驗,謀求更優(yōu)化的解法。
總結(jié)
以上是生活随笔為你收集整理的算法竞赛入门经典(第二版) | 习题3-10 盒子 (pair结构体)(UVa1587,Box)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简介明了——map+multimap头文
- 下一篇: 算法竞赛入门经典(第二版) | 例题5-