天天看點

一種排序

一種排序

時間限制:3000 ms | 記憶體限制:65535 kb

難度:3

描述

現在有很多長方形,每一個長方形都有一個編号,這個編号可以重複;還知道這個長方形的寬和長,編号、長、寬都是整數;

現在要求按照一下方式排序(預設排序規則都是從小到大);

1.按照編号從小到大排序

2.對于編号相等的長方形,按照長方形的長排序;

3.如果編号和長都相同,按照長方形的寬排序;

4.如果編号、長、寬都相同,就隻保留一個長方形用于排序,删除多餘的長方形;最後排好序按照指定格式顯示所有的長方形;

輸入

第一行有一個整數 0<n<10000,表示接下來有n組測試資料;

每一組第一行有一個整數 0<m<1000,表示有m個長方形;

接下來的m行,每一行有三個數 ,第一個數表示長方形的編号,

第二個和第三個數值大的表示長,數值小的表示寬,相等

說明這是一個正方形(資料約定長寬與編号都小于10000);

輸出

順序輸出每組資料的所有符合條件的長方形的 編号 長 寬

樣例輸入

1

8

1 1 1

1 1 2

1 2 1

1 2 2

2 1 1

2 1 2

2 2 1

樣例輸出

//這裡我用了泛型算法裡面的qsort函數,在頭檔案<algorithm>中

隻要排好,在輸出的時候把重複的不輸出就可以了

代碼如下:

#include <iostream>

#include <algorithm>

using namespace std;

struct square

{

public:

int no;//編号

int length;//長

int width;//寬

};

int cmp(const void *p, const void *q)

square *s = (square *)(p);

square *s1 = (square *)(q);

if (s->no != s1->no)

return s->no - s1->no > 0 ? 1 : -1;

else

if (s->length != s1->length)

return s->length - s1->length >0 ? 1 : -1;

if (s->width != s1->width)

return s->width - s1->width > 0 ? 1 : -1;

}

int main()

int n;

cin >> n; //n組測試資料

for (int test = 1; test <= n; test++)

int m;

cin >> m;//m個正方形

int a, b;

square *s = new square[m];

for (int i = 0; i < m; i++)

//*******************************

cin >> s[i].no >> a >> b;

if (a > b)

s[i].length = a;

s[i].width = b;

s[i].length = b;

s[i].width = a;

qsort(s, m, sizeof(s[0]), cmp);

cout << s[0].no << " " << s[0].length << " "

<< s[0].width << endl;

for (int i = 1; i < m; i++)

if (s[i].no == s[i-1].no && s[i].length == s[i-1].length

&& s[i].width == s[i-1].width)

continue;

cout << s[i].no << " " << s[i].length << " "

<< s[i].width << endl;

delete [] s;

return 0;

上一篇: 奇偶數分離

繼續閱讀