一种排序

来源:互联网 发布:mac怎么打开html文件 编辑:程序博客网 时间:2024/05/20 13:16

一种排序

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

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

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

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

4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;
输入
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,

第二个和第三个数值大的表示长,数值小的表示宽,相等
说明这是一个正方形(数据约定长宽与编号都小于10000);
输出
顺序输出每组数据的所有符合条件的长方形的 编号 长 宽
样例输入
181 1 11 1 11 1 21 2 11 2 22 1 12 1 22 2 1
样例输出
1 1 11 2 11 2 22 1 12 2 1

解题思路:

         一开始看到题目的时候我就想到了set来做,因为set能自动帮你完成重复删除且从小到大排列。但是未学过stl,重载的用法。所以在写结构体排序的时候,想不出如何写一个规则使它从左向右按从大到小的顺序排。后来看到了大神的代码焕然大悟的。还有的是以前做过一题不是用结构体的set的题。在输出时是用{a.begin(),a.size()}的,之后也是写这个,结果报错了。原来结构体不能用size了,因为结构体不能计算长度,要用end()才行。
我的代码:
#include <iostream>#include <algorithm>#include <set>using namespace std;struct S {int id;int h;int w;};bool operator<(const S& r1,const S& r2)  {  return r1.id<r2.id || r1.id==r2.id && r1.h<r2.h ||r1.id==r2.id&&r1.h==r2.h &&r1.w<r2.w;  }  int main(){set<S> a;S p;int n,m;cin >> n;while (n--){cin >> m;for (int i=0;i<m;++i){cin >> p.id;cin >> p.h >> p.w;if (p.h<p.w){swap(p.h,p.w);}a.insert(p);}set<S>::iterator it;for (it=a.begin();it!=a.end();++it){cout << it->id << " " << it->h << " " << it->w ;cout << endl;}a.clear();}return 0;}
大神地址:http://blog.csdn.net/zcy20121105/article/details/8813138
参考的代码:
#include<iostream>  #include<set>  #include<iterator>  using namespace std;  struct Rect  {      int num,length,width;        };  bool operator<(const Rect& r1,const Rect& r2)  {      return r1.num<r2.num || r1.num==r2.num && r1.length<r2.length ||r1.num==r2.num&&r1.length==r2.length &&r1.width<r2.width;  }  istream& operator>>(istream& in,Rect& r)  {      in>>r.num;      int a,b;      cin>>a>>b;      r.length=max(a,b);      r.width=min(a,b);      return in;  }  ostream& operator<<(ostream& out,const Rect& r)  {      return out<<r.num<<" "<<r.length<<" "<<r.width;  }  int main()  {      int num;      cin>>num;      while(num--)      {          set<Rect> rs;          Rect r;          int n;          cin>>n;             while(n--)          {              cin>>r;              rs.insert(r);          }          copy(rs.begin(),rs.end(),ostream_iterator<Rect>(cout,"\n"));                }      }          
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻子干口干胃烧怎么办 颈椎病压迫神经引起手麻怎么办 4个月婴儿睡觉少怎么办 晚上睡觉睡不好老是醒来怎么办 吃了没熟的香蕉怎么办 70岁父母老吵架怎么办 怀孕七个月晚上睡不着怎么办 九个月宝宝睡眠不好怎么办 一个月的宝宝放不下怎么办 宝宝被吓了发烧怎么办 体内火气重睡不着觉怎么办 宝宝睡觉一直翻身发出声音怎么办 严重失眠怎么办整夜睡不着觉 腿疼得睡不着觉怎么办 19岁晚上睡不着该怎么办 工作累的想哭怎么办 心累迷茫想哭怎么办 白天很累晚上又睡不着怎么办 发型睡觉压乱了怎么办 通宵一夜第二天怎么办 夏天了腿脚还凉怎么办 咖啡色三天了月经还是下不来怎么办 睡觉姿势不对腰疼怎么办 来月经吃了香瓜怎么办 减肥期间晚上有饭局怎么办 减肥期间遇到晚上聚餐怎么办 婴儿脸不向上睡怎么办 睡觉压奶了疼怎么办 堵奶了挤不下来怎么办 孕36周胎儿腿短怎么办 孕晚期胎儿腿短怎么办 孕晚期宝宝腿短怎么办 手劳累过度麻痛怎么办 大人发烧40不退怎么办? 颈椎扯的脑袋疼怎么办 孕妇颈椎痛导致失眠怎么办 做完运动脊椎中间痛怎么办? 阴虛阴虚火旺怎么办 脸一躺下就丑怎么办 身体淤堵的厉害怎么办 怀孕晚期脚肿了怎么办