总Time Limit: 1000ms Memory Limit: 65536kB
Description
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
- 老年人(年龄 >= 60岁)比非老年人优先看病。
- 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
- 非老年人按登记的先后顺序看病。
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 | 年龄 |
---|---|
021033 | 75 |
010158 | 67 |
004003 | 15 |
021075 | 40 |
102012 | 30 |
这样才对吧。
#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;
}
这个完全可以当模板来使用,好好用啊,已经用这个作出三道排序题了。