一种排序

xiaoxiao2021-02-28  42

一种排序 时间限制: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

思路:就是排序,先对序号排序,然后 对长和宽排序,最后去重 主要是 如何存储数据,可以用二维数组,也可以用结构体,个人感觉结构体比较简单,重再考察 结构体排序,二维数组的排序 这个知识很重要

#include <iostream> #include <algorithm> using namespace std; class cuba { public: int num; int x; // 长度 int y; // 宽度 }; // 结构体 sort排序, 如果num相等 按照x从小到大排序,如果x相等按照y从小到大排序 // 如果num不相等 按照num从小到大排序 bool comp(cuba lns, cuba rns) { if (lns.num == rns.num) { return lns.x < rns.x; if (lns.x == rns.x) { return lns.y < rns.y; } } else return lns.num < rns.num; } int main() { cuba a[1001]; int n; cin >> n; while (n--) { int m; cin >> m; int t; for (int i = 0; i < m; i++) { cin >> a[i].num >> a[i].x >> a[i].y; if (a[i].x < a[i].y) // 将x做为大的值, { t = a[i].x; a[i].x = a[i].y; a[i].y = t; } } // 排序 按照编号排序(结构体排序) /* cuba temp; for (int i = 0; i < m; i++) { for (int j = 0; j < m-1-i; j++) { if (a[j].num > a[j+1].num) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } */ sort(a, a+m, comp); for (int i = 0; i < m;) { if (a[i].num == a[i+1].num && a[i].x == a[i+1].x && a[i].y == a[i+1].y) i++; else { cout << a[i].num << " " <<a[i].x << " " << a[i].y << endl; i++; } } } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2613849.html

最新回复(0)