• 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 }

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

     
  • 相关阅读:
    博客园安卓客户端合仔茶版本V4.0震撼发布
    提示功能的检索框
    .net 玩自动化浏览器
    《表单篇》DataBase之大数据量经验总结
    自定义表主键
    一次网络程序Debug过程
    关于.NET下开源及商业图像处理(PSD)组件
    利用反射从程序集dll中动态调用方法
    Linux内核源码分析方法
    wcf基础教程之 契约(合同)Contract
  • 原文地址:https://www.cnblogs.com/jasonJie/p/6085453.html
Copyright © 2020-2023  润新知