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

 

posted @ 2018-03-22 23:51  zhaoGavin  阅读(140)  评论(0编辑  收藏  举报