病人排队

总Time Limit: 1000ms Memory Limit: 65536kB
Description
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

  1. 老年人(年龄 >= 60岁)比非老年人优先看病。
  2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
  3. 非老年人按登记的先后顺序看病。
    Input
    第1行,输入一个小于100的正整数,表示病人的个数;
    后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
    Output
    按排好的看病顺序输出病人的ID,每行一个。
    Sample Input
    5
    021075 40
    004003 15
    010158 67
    021033 75
    102012 30
    Sample Output
    021033
    010158
    021075
    004003
    (这两个应该反了)
    102012

这个样例输出应该是有问题的,非老年人应该按照ID从小到大排序

ID年龄
02103375
01015867
00400315
02107540
10201230

这样才对吧。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
using namespace std;
struct patient{
	string id;
	int age;
}; 
struct rule{
	bool operator()(const patient &a,const patient &b){
		if(a.age>=60&&b.age>=60){
			if(a.age==b.age)
			   return a.id<b.id;
			else
			   return a.age>b.age;
		}
		if(a.age<60&&b.age<60)
		    return a.id<b.id;
		else if(a.age>=60&&b.age<60)
		    return a.age>b.age;
	}
};
int main(){
	int n;
	cin>>n;
	set<patient,rule> st;//存放按照Rule排序的数组 
	map<string,int> mp;
	while(n--){//ctrl+z 空格结束输入 
	    string s;
	    int f;
	    cin>>s>>f;
	    mp[s]=f;
	    for(map<string,int>::iterator i=mp.begin() ; i!=mp.end(); ++i){//将mp中的单词按照Rule存入排序容器st 
	        patient tmp;
	        tmp.id=i->first;
	        tmp.age=i->second;
	        st.insert(tmp);
	   }
    }
	for(set<patient,rule>::iterator i=st.begin();i!=st.end();++i)
	   cout<<i->id<<" "<<i->age<<endl;
	return 0; 
}

这个完全可以当模板来使用,好好用啊,已经用这个作出三道排序题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值