string表示的数字不能直接比较 PAT 7-27 宿舍谁最高?

题面

在这里插入图片描述

输入样例

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<algorithm>
#include<string>
#include<queue>
using namespace std;
struct stu{
	string no;
	string name;
	int h;
	int w;
};
queue<stu> ans;
bool is(string s1,string s2){//string can't compared straight,despites their lenght are equal
	if(s1.length() == s2.length()){
		return s1<s2;
	}else{
		return s1.length()<s2.length();
	}
}
bool cmp0(stu s1,stu s2){
	if(is(s1.no,s2.no)){
		return true;
	}
	return false;
}

int main()
{
	int n;
	cin >> n;
	stu st[n];
	//输入 
	for(int i=0;i<n;i++){
		cin >> st[i].no >> st[i].name >> st[i].h >> st[i].w;
	}
	//处理 
	sort(st,st+n,cmp0);
	stu tmp = st[0];
	for(int i=0;i<n;i++){
		if(st[i].no == tmp.no){
			if(st[i].h>tmp.h){
				tmp = st[i];
			}
		}else{
			ans.push(tmp);
			tmp = st[i];	
		}if(i==n-1){
			ans.push(tmp);
		}
	} 
	//输出 
	while(ans.size()){
		int k = 6-ans.front().no.length();//输出补0 
		while(k--){
			cout << "0";
		}
		cout<<ans.front().no<<" "<<ans.front().name<<" "<<ans.front().h<<" "<<ans.front().w;
		ans.pop();
		if(ans.size()){
			cout << endl;
		}
	}
	
	return 0;
}
注意点
  • 用string表示的数字不能直接比较,如9和123比较,“9”>“123”。有两个选择:
    (1)直接用int读取,在范围内有效。注意宿舍号的范围是[0,999999]。而不是[000000,999999]。(题目的输入样例太有迷惑性了,还是我太菜了…)但是要注意输出时补0。
    (2)用string,增加一个比较函数
//string can't compared straight,despites their lenght are equal
bool is(string s1,string s2){
	if(s1.length() == s2.length()){
		return s1<s2;
	}else{
		return s1.length()<s2.length();
	}
}
用int存宿舍号
用map存放
发布了37 篇原创文章 · 获赞 1 · 访问量 2729

猜你喜欢

转载自blog.csdn.net/qq_39685968/article/details/104540044