β

[ACM_NYOJ_8]一种排序

蓝飞技术部落格 284 阅读

一种排序

时间限制:3000 ms | 内存限制:65535 KB

描述

现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

1.按照编号从小到大排序

2.对于编号相等的长方形,按照长方形的长排序;

3.如果编号和长都相同,按照长方形的宽排序;

4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;

输入

第一行有一个整数 0<n<10000,表示接下来有n组测试数据;

每一组第一行有一个整数 0<m<1000,表示有m个长方形;

接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,

第二个和第三个数值大的表示长,数值小的表示宽,相等

说明这是一个正方形(数据约定长宽与编号都小于10000);

输出

顺序输出每组数据的所有符合条件的长方形的 编号 长 宽

样例输入

  1. 1
  2. 8
  3. 1 1 1
  4. 1 1 1
  5. 1 1 2
  6. 1 2 1
  7. 1 2 2
  8. 2 1 1
  9. 2 1 2
  10. 2 2 1

样例输出

  1. 1 1 1
  2. 1 2 1
  3. 1 2 2
  4. 2 1 1
  5. 2 2 1
more

来源

NYOJ

代码如下:

  1. #include<stdio.h>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. struct s{
  6. int id, a, b;
  7. s(int id, int a, int b):id(id),a(a),b(b){};
  8. };
  9. bool cmp(s s1, s s2){
  10. if(s1.id != s2.id){
  11. return s1.id < s2.id;
  12. }
  13. if(s1.a != s2.a){
  14. return s1.a < s2.a;
  15. }
  16. return s1.b < s2.b;
  17. }
  18. int main(){
  19. int t;
  20. scanf("%d", &t);
  21. while(t--){
  22. int n, id, a, b;
  23. vector<s> v;
  24. scanf("%d", &n);
  25. while(n--){
  26. scanf("%d%d%d", &id, &a, &b);
  27. if(a < b){
  28. a = a ^ b;
  29. b = b ^ a;
  30. a = a ^ b;
  31. }
  32. v.push_back(s(id, a, b));
  33. }
  34. sort(v.begin(), v.end(), cmp);
  35. id = 0; a = 0; b = 0;
  36. for(vector<s>::iterator it = v.begin(); it != v.end(); ++it){
  37. if(id != (*it).id || a != (*it).a || b!= (*it).b){
  38. id = (*it).id;
  39. a = (*it).a;
  40. b = (*it).b;
  41. printf("%d %d %d\n", id, a, b);
  42. }
  43. }
  44. }
  45. return 0;
  46. }
作者:蓝飞技术部落格
蓝飞技术部落格是一个技术发烧友的自留地,关注前端开发、后台技术、编程算法等代码技术与艺术,与同样热爱生活,热衷技术的同学一起共勉。
原文地址:[ACM_NYOJ_8]一种排序, 感谢原作者分享。