1. 程式人生 > >ACM:一種排序(操作符過載、vector排重)

ACM:一種排序(操作符過載、vector排重)


一種排序 時間限制: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;
}