7-8 宿舍谁最高? (25 分)
学校选拔篮球队员,每间宿舍最多有4个人。现给出宿舍列表,请找出每个宿舍最高的同学。定义一个学生类Student,有身高height,体重weight等。
输入格式:
首先输入一个整型数n (1<=n<=1000000),表示n位同学。
紧跟着n行输入,每一行格式为:宿舍号,name,height,weight。
宿舍号的区间为[0,999999], name 由字母组成,长度小于16,height,weight为正整数。
输出格式:
按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学。
输入样例:
7
000000 Tom 175 120
000001 Jack 180 130
000001 Hale 160 140
000000 Marry 160 120
000000 Jerry 165 110
000003 ETAF 183 145
000001 Mickey 170 115
输出样例:
000000 Tom 175 120
000001 Jack 180 130
000003 ETAF 183 145
感悟: 总的解题思路是对的,注意宿舍编号六位,字符串输入的话注意补齐,整型存储的话,输出的话注意控制格式。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=25;
typedef struct Node{
char name[20];
int h,w;
}student;
string id,t;
int main(){
int n;
cin>>n;
getchar();
set<string> s;
map<string,student> mp;
student tmp,p;
for(int i=0;i<n;i++){
id="";
cin>>t;
for(int i=0;i<6-t.length();i++){
id+='0';
}
id+=t;
cin>>tmp.name>>tmp.h>>tmp.w;
if(s.find(id)==s.end()){
mp[id]=tmp;
}else{
p=mp[id];
if(p.h<tmp.h) mp[id]=tmp;
}
s.insert(id);
}
set<string> ::iterator it;
for(it=s.begin();it!=s.end();it++){
string t=*it;
cout<<t<<" "<<mp[t].name<<" "<<mp[t].h<<" "<<mp[t].w<<endl;
}
return 0;
}
另一种写法:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=25;
typedef struct Node{
char name[20];
int h,w;
Node(){
h=0;
w=0;
}
}student;
int main(){
int n,id;
cin>>n;
getchar();
map<int,student> mp;
student tmp;
for(int i=0;i<n;i++){
cin>>id;
cin>>tmp.name>>tmp.h>>tmp.w;
if(mp[id].h<tmp.h) mp[id]=tmp;
}
map<int,student> ::iterator it;
for(it=mp.begin();it!=mp.end();it++){
int t=it->first;
printf("%06d",t);
cout<<" "<<mp[t].name<<" "<<mp[t].h<<" "<<mp[t].w<<endl;
//cout<<" "<<(it->second).name<<" "<<(it->second).h<<" "<<(it->second).w<<endl;
}
return 0;
}