HDU1871-1872-1873-结构体排序

来源:互联网 发布:java希尔排序算法 编辑:程序博客网 时间:2024/06/06 08:28

这里介绍三个小题,主要都是结构体里面的排序。


第一题:无题 HDU - 1871,链接https://vjudge.net/problem/HDU-1871

构造房间结构体,按照价格排序。

#include<iostream>#include<algorithm>using namespace std;struct Room{    int id,cnt,price;    bool operator < (const Room &a) const{        if(a.price!=price) return price<a.price;    }}room[101];int main(){    int T;    cin>>T;    while(T--){        int c;        cin>>c;        for(int i=0;i<c;i++){            cin>>room[i].id>>room[i].cnt>>room[i].price;        }        sort(room,room+c);        int t,sum;        cin>>t;        while(t--){            cin>>sum;            int flag=0;            for(int i=0;i<c;i++){                if(room[i].cnt>=sum){                    room[i].cnt-=sum;                    flag=1;                    cout<<room[i].id<<endl;                    break;                }            }            if(flag==0) cout<<"sorry"<<endl;        }    }}

第二题:稳定排序 HDU - 1872 ,链接https://vjudge.net/problem/HDU-1872

构造学生结构体,首先按照分数排序,分数相同基础上按照原id排序。

#include<iostream>#include<cstring>#include<algorithm>using namespace std;struct Stu{    char name[55];    int score,id;    bool operator < (const Stu &a) const{        if(score!=a.score) return score>a.score;        else return id<a.id;    }}stu[310],xu[310];int n;void out(Stu a[],int n){    for(int i=0;i<n;i++) cout<<a[i].name<<' '<<a[i].score<<endl;}int main(){    while(cin>>n){        for(int i=0;i<n;i++){            cin>>stu[i].name>>stu[i].score;            stu[i].id=i;        }        for(int i=0;i<n;i++){            cin>>xu[i].name>>xu[i].score;        }        sort(stu,stu+n);        int flag1=1,flag2=1;        for(int i=0;i<n;i++){            if(stu[i].score!=xu[i].score){                cout<<"Error"<<endl;                out(stu,n);                flag2=0;                break;            }        }        if(flag2==0) continue;        for(int i=0;i<n;i++){            if(strcmp(stu[i].name,xu[i].name)!=0){                cout<<"Not Stable"<<endl;                out(stu,n);                flag1=0;                break;            }        }        if(flag1==0) continue;        cout<<"Right"<<endl;    }    return 0;}

第三题:看病要排队 HDU - 1873,链接https://vjudge.net/problem/HDU-1873

这题不难,就是复杂,敲代码要仔细。我的代码里面好多num1,num2这样的参数,不要写错了写混淆了。仔细模拟,可解!

#include<iostream>#include<cstring>#include<algorithm>using namespace std;struct ys{    int id=0,weight=0,zt=0;    bool operator < (const ys &a) const{        if(weight!=a.weight) return weight>a.weight;        else return id<a.id;    }}ys1[2002],ys2[2002],ys3[2002];int main(){    int n;    while(cin>>n){        char s[5];        int a,b,cnt=0,num1=0,num2=0,num3=0,out1=0,out2=0,out3=0;        while(n--){            cin>>s;            if(s[0]=='I'){                cin>>a>>b;                cnt++;                if(a==1){ys1[num1].weight=b;ys1[num1].id=cnt;ys1[num1].zt=1;num1++; }                if(a==2){ys2[num2].weight=b;ys2[num2].id=cnt;ys2[num2].zt=1;num2++; }                if(a==3){ys3[num3].weight=b;ys3[num3].id=cnt;ys3[num3].zt=1;num3++; }            }else{                cin>>a;                if(a==1){                    if(out1+1-num1>0){cout<<"EMPTY"<<endl;}                    else {                        out1++; sort(ys1,ys1+num1);                        for(int i=0;i<num1;i++){                            if(ys1[i].zt==1){                                cout<<ys1[i].id<<endl;                                ys1[i].zt=0;                                break;                            }                        }                    }                }if(a==2){                    if(out2+1-num2>0){cout<<"EMPTY"<<endl;}                    else {                        out2++; sort(ys2,ys2+num2);                        for(int i=0;i<num2;i++){                            if(ys2[i].zt==1){                                cout<<ys2[i].id<<endl;                                ys2[i].zt=0;                                break;                            }                        }                     }                }if(a==3){                    if(out3+1-num3>0){cout<<"EMPTY"<<endl;}                    else {out3++; sort(ys3,ys3+num3);                        for(int i=0;i<num3;i++){                            if(ys3[i].zt==1){                                cout<<ys3[i].id<<endl;                                ys3[i].zt=0;                                break;                            }                        }                     }                }            }        }    }    return 0;}

原创粉丝点击