这里介绍三个小题,主要都是结构体里面的排序。
第一题:无题 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;
}