HDU1871-1872-1873-结构体排序

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


第一题:无题 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值