1. 程式人生 > >一種排序(南陽oj 8)

一種排序(南陽oj 8)

時間限制: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

來源

經典題目

上傳者

iphxer

描述

現在有很多長方形,每一個長方形都有一個編號,這個編號可以重複;還知道這個長方形的寬和長,編號、長、寬都是整數;現在要求按照一下方式排序(預設排序規則都是從小到大);

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;
}