nyoj08 一种排序

这道题在分类中属于STL,写了两种解法

1、很容易直接想到三层遍历进行排序,我写得比较暴力,时间消耗较大,不推荐

#include <iostream>
using namespace std;
struct Rect{
    int id,a,b;
}f[1001];

int main() {
    int n;
    cin>>n;
    while(n--){
        int m;
        cin>>m;
    //输入
for(int i=0;i<m;i++){ cin>>f[i].id>>f[i].a>>f[i].b; if(f[i].a<f[i].b){ int temp = f[i].a; f[i].a = f[i].b; f[i].b = temp; } }
    //排序
for(int i=0;i<m;i++){ for(int j = i+1;j<m;j++){ if(f[i].id>f[j].id){ rtg temp = f[i]; f[i] = f[j]; f[j] = temp; }else if(f[i].id==f[j].id&&f[i].a>f[j].a){ rtg temp = f[i]; f[i] = f[j]; f[j] = temp; }else if(f[i].id==f[j].id&&f[i].a==f[j].a&&f[i].b>f[j].b){ rtg temp = f[i]; f[i] = f[j]; f[j] = temp; } } }
    //标记去重
for(int i=0;i<m;i++){ for(int j = i+1;j<m;j++){ if(f[i].id==f[j].id){ if(f[i].a==f[j].a){ if(f[i].b==f[j].b){ flag[j] = 1; } } } } } for(int i=0;i<m;i++){ if(flag[i]==0){ cout<<f[i].id<<" "<<f[i].a<<" "<<f[i].b<<endl; } } } return 0; }

 

2、用到set,set好处是没有重复元素和内部有序,这两点都符合题意

#include <iostream>
#include<set>
using namespace std;
struct Rect{
    int id,a,b;
  //运算符重载
bool operator <(const Rect& r)const{ return this->id != r.id ? this->id < r.id : (this->a != r.a ? this->a < r.a : this->b < r.b); } }; set<Rect> s; int main() { int n,id,a,b; Rect r; cin>>n; while(n--){ int m; cin>>m; s.clear(); while(m--){ cin>>id>>a>>b; if(a<b){ swap(a,b); } Rect r; r.id = id,r.a = a;r.b = b; s.insert(r); } set<Rect>::iterator iter = s.begin(); while(iter!=s.end()){ cout<<iter->id<<" "<<iter->a<<" "<<iter->b<<endl; iter++; } } return 0; }

 

转载于:https://www.cnblogs.com/zhaoGavin/p/8627802.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值