• nyoj 8 一种排序


    一种排序

    时间限制: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

    注意题目要求,第二个和第三个数值大的表示长,数值小的表示宽,相等
    说明这是一个正方形(数据约定长宽与编号都小于10000)
    代码如下
     1 #include <cstdio>
     2 #include <cmath>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 struct Matrix{
     7     int id;
     8     int length;
     9     int high;
    10 };
    11 
    12 Matrix toD[1002];
    13 
    14 int cmp(const void *a, const void *b) {
    15     Matrix at = *(Matrix*)a;
    16     Matrix bt = *(Matrix*)b;
    17     int f = at.id - bt.id;
    18     if(f == 0) {
    19         int s = at.length - bt.length;
    20         if(s == 0) {
    21             return at.high - bt.high;
    22         }
    23         return s;
    24     }
    25     return f;
    26 }
    27 
    28 int main(int argc, char const *argv[])
    29 {
    30     int n;
    31     //freopen("input.txt","r",stdin);
    32     while(scanf("%d",&n) != EOF) {
    33         while(n--) {
    34             int m;
    35             scanf("%d",&m);
    36             for(int i = 0; i < m; i++) {
    37                 scanf("%d %d %d",&toD[i].id, &toD[i].length, &toD[i].high);
    38                 if(toD[i].length < toD[i].high) {
    39                     swap(toD[i].length, toD[i].high);
    40                 }
    41             }
    42 
    43 
    44             qsort(toD, m, sizeof(Matrix), cmp);
    45             
    46             printf("%d %d %d
    ",toD[0].id, toD[0].length, toD[0].high);
    47             int i = 1;
    48             while(i < m) {
    49                 if(!(toD[i].id == toD[i-1].id && toD[i].length == toD[i-1].length && toD[i].high == toD[i-1].high)) {
    50                     printf("%d %d %d
    ",toD[i].id, toD[i].length, toD[i].high);
    51                 }
    52                 i++;
    53             }
    54         }
    55     }
    56     return 0;
    57 }

    需要注意的是如何输出不重复的值

     
  • 相关阅读:
    Centos8 静态IP设置
    2022年1月6号 LocalDateTime触发列无效问题
    2021年12月14日复盘(Oracle Not In,Limit 1000)
    2022年1月2日复盘 线上CPU飙升
    2021年12月16日复盘 JSQLParser 命中Oracle关键词报错
    2022年1月5号 on update CURRENT_TIMESTAMP无效情况记录
    2021年12月21日复盘 雪花算法 服务器时钟偏移错误
    Centos替换源
    2021年12月9日复盘 前端日期少8小时
    WPF中DataContext作用
  • 原文地址:https://www.cnblogs.com/jasonJie/p/6085453.html
Copyright © 2020-2023  润新知