一種排序(南陽oj 8)
阿新 • • 發佈:2018-12-03
時間限制:3000 ms | 記憶體限制:65535 KB
難度:3
輸入
第一行有一個整數 0<n<10000,表示接下來有n組測試資料;
每一組第一行有一個整數 0<m<1000,表示有m個長方形;
接下來的m行,每一行有三個數 ,第一個數表示長方形的編號,
第二個和第三個數值大的表示長,數值小的表示寬,相等
說明這是一個正方形(資料約定長寬與編號都小於10000);
輸出
順序輸出每組資料的所有符合條件的長方形的 編號 長 寬
樣例輸入
1 8 1 1 1 1 1 1 1 1 2 1 2 1 1 2 2 2 1 1 2 1 2 2 2 1
樣例輸出
1 1 1 1 2 1 1 2 2 2 1 1 2 2 1
來源
上傳者
描述
現在有很多長方形,每一個長方形都有一個編號,這個編號可以重複;還知道這個長方形的寬和長,編號、長、寬都是整數;現在要求按照一下方式排序(預設排序規則都是從小到大);
1.按照編號從小到大排序
2.對於編號相等的長方形,按照長方形的長排序;
3.如果編號和長都相同,按照長方形的寬排序;
4.如果編號、長、寬都相同,就只保留一個長方形用於排序,刪除多餘的長方形;最後排好序按照指定格式顯示所有的長方形;
分析: 首先,這道題長方形的長肯定比寬大,所以需要先對輸入資料進行比較
其次,就是將重複的資料刪除掉,在這裡我是想到了set可以直接不儲存重複資料,因此我用到了set
#include <iostream> #include <stdio.h> #include <set> using namespace std; struct Esc { int one,two,three; bool operator<(const Esc &a) const { if(a.one!=one)//比較編號大小 { return a.one>one;//由小到大 } else if(a.one==one) { if(a.two!=two)//比較長的大小 { return a.two>two; } else//比較寬 { return a.three>three; } } } }; int main() { int a,b,x,y,z,t,i; scanf("%d",&a); set<Esc>s; Esc esc; while(a--) { s.clear(); scanf("%d",&b); for(i=1;i<=b;i++) { scanf("%d %d %d",&x,&y,&z); if(y<z)//長寬互換位置 { t=y; y=z; z=t; } esc.one=x; esc.two=y; esc.three=z; s.insert(esc); } set<Esc>::iterator it;//輸出並將重複資料刪去 for(it=s.begin();it!=s.end();it++) { cout<<(*it).one<<" "<<(*it).two<<" "<<(*it).three<<endl; } } return 0; }