ACM:一種排序(操作符過載、vector排重)
阿新 • • 發佈:2019-02-19
一種排序 時間限制:3000 ms | 記憶體限制:65535 KB 難度:3
- 描述
- 現在有很多長方形,每一個長方形都有一個編號,這個編號可以重複;還知道這個長方形的寬和長,編號、長、寬都是整數;現在要求按照一下方式排序(預設排序規則都是從小到大);
1.按照編號從小到大排序
2.對於編號相等的長方形,按照長方形的長排序;
3.如果編號和長都相同,按照長方形的寬排序;
4.如果編號、長、寬都相同,就只保留一個長方形用於排序,刪除多餘的長方形;最後排好序按照指定格式顯示所有的長方形;- 輸入
-
第一行有一個整數 0<n<10000,表示接下來有n組測試資料;
每一組第一行有一個整數 0<m<1000,表示有m個長方形;
接下來的m行,每一行有三個數 ,第一個數表示長方形的編號,
第二個和第三個數值大的表示長,數值小的表示寬,相等
說明這是一個正方形(資料約定長寬與編號都小於10000); - 輸出
順序輸出每組資料的所有符合條件的長方形的 編號 長 寬
用來練習 操作符過載、以及vector排重 (用set 效能會更優)
// // main.cpp // 碼排序 // // Created by H@L on 14-6-19. // Copyright (c) 2014年 Hzw. All rights reserved. // #include <iostream> #include <algorithm> #include <vector> using namespace std; class Rectangular { public: int m_iID; int m_iLength; int m_iWidth; public: bool operator< (const Rectangular &data)const; bool operator== (const Rectangular &data)const ; friend istream &operator>> (istream &scin,Rectangular &data); friend ostream &operator<< (ostream &scout,Rectangular &data); }; bool Rectangular::operator< (const Rectangular &data)const { return (m_iID < data.m_iID) ||(m_iID== data.m_iID && m_iLength < data.m_iLength) || (m_iID == data.m_iID && m_iLength== data.m_iLength && m_iWidth < data.m_iWidth); }; bool Rectangular::operator== (const Rectangular &data)const { if (m_iID==data.m_iID && m_iLength==data.m_iLength && m_iWidth == data.m_iWidth) return true; else return false; } istream &operator>> (istream &scin,Rectangular &data) { scin >> data.m_iID; scin >> data.m_iLength; scin >> data.m_iWidth; if ( data.m_iWidth > data.m_iLength) swap(data.m_iLength, data.m_iWidth); return scin; } ostream &operator<< (ostream &scout, Rectangular&data) { scout << data.m_iID << " "; scout << data.m_iLength << " "; scout << data.m_iWidth << endl; return scout; } int main() { int n; cin >> n; while(n--) { int m; cin>>m; vector<Rectangular> vDataBuf; vDataBuf.clear(); for(int i=0;i<m;i++) { Rectangular data; cin >> data; vDataBuf.push_back(data); } sort(vDataBuf.begin(),vDataBuf.end(),less<Rectangular>()); //刪除重複 unique 返回相鄰相等 vDataBuf.erase(unique(vDataBuf.begin(), vDataBuf.end()),vDataBuf.end()); for (vector<Rectangular>::iterator iPos=vDataBuf.begin(); iPos != vDataBuf.end(); iPos++) { cout << *iPos; } } return 0; }