一種排序 poj8

一種排序

時間限制: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 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
第一次有了這麼多STL,重載sort,unique,個人覺得這個題難度應爲 1
#include <iostream>
#include <cstdio>
using namespace std;
#include <algorithm>
#include <vector>

struct Job{
	int num, a, b;
	Job(int x,int y, int z){
		num = x;	a = y;	b = z;
	}
	bool operator < (const Job &X) const {
		if(num == X.num)
			if(a == X.a)
				return b < X.b;
			else	return a < X.a;
		else	return num < X.num;
	}
	bool operator == (const Job &X) const {
		return num == X.num && a == X.a && b == X.b;
	}
};
int main()
{
	int T, num;
	cin>>T;
	while(T--){
		cin>>num;
		vector<Job>v;
		while(num--) {
			int x, y, z;
			cin>>x>>y>>z;
			if(y<z){
				y = y + z;
				z = y - z;
				y = y - z;
			}
			Job job(x, y, z);	v.push_back(job);
		}
	//	cout<<endl;
		sort(v.begin(),v.end());
		vector<Job>::iterator s = unique(v.begin(),v.end());
		v.erase(s,v.end());
		//vecSrc.erase( unique( vecSrc.begin(), vecSrc.end() ), vecSrc.end() );
		for(int i = 0; i < v.size();i++)
			printf("%d %d %d\n", v[i].num, v[i].a, v[i].b);
	//	cout<<endl;
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章