PTA 7-1 宿舍谁最高?(20分)

这是一个菜鸡的挣扎过程!!不要嫌弃本辣鸡55555
输入格式:
首先输入一个整型数n (1<=n<=1000000),表示n位同学。
紧跟着n行输入,每一行格式为:宿舍号,name,height,weight。
宿舍号的区间为[0,999999], name 由字母组成,长度小于16,height,weight为正整数。

输出格式:
按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学

分析:

题目要求是写一个Student类,这很好办。接着无论是按照宿舍号从小到大排序还是输出最高的同学的身高,本质都是排序问题。只是我的问题在于用什么容器来存放学生,宿舍的信息。以及如果宿舍号以字符串形式输入的话,该如何排序。
以下是3版代码,3种思路,可以解开疑惑:

  1. Version 1
//Version--1
//不幸的是,这一版WA了,原因是内存超限
/**
author: Y-Star
*/
#include <bits/stdc++.h>
using namespace std;

class Student{
private:
	string order;
	string name;
    int height;
    int weight;
public: 
     Student (string order,string s,int x,int y):order(order),name(s),height(x),weight(y) { };
     ~Student(){ };
     
     int getHeight(){
     	return height;
	 }
	 int getWeight(){
	 	return weight;
	 }
	 string getName(){
	 	return name;
	 }
	string getOrder(){
		return order;
	}
	 const Student& operator=(const Student& r){
	 //重载输出运算符
		 height = r.height;
		 name = r.name;
		 weight = r.weight;
		 return *this;
	 }
};

vector<Student> room[1000010];		
//这里浪费了太多内存
int toint(string a){
//把字符串转换成对应的整数---愚蠢的做法!!!
	int sum=0;
	for(int i=0;i<6;i++){
		sum+=(a[i]-'0')*pow(10,i);
	}
	return sum;
} 

Student getMax(vector<Student> a){
//获取每间房最高的学生
	for (int i = 0; i < a.size();i++){
		for (int j = i + 1; j < a.size();j++){
			if(a[i].getHeight()>a[j].getHeight()){
				Student tmp = a[j];
				a[j] = a[i];
				a[i] = tmp;
			}
		}
	}
	return a[a.size() - 1];
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n;i++){
		string s1, s2;
		int n1, n2;
		cin >> s1 >> s2 >> n1 >> n2;
		Student u(s1, s2, n1, n2);
		int ord = toint(s1);
		room[ord].push_back(u);
		//按房间号存入
	}
	for (int i = 0; i < 1000000;i++){
	//按房间号顺序输出,免于排序
		if(room[i].size()!=0){
			Student s = getMax(room[i]);
			cout << s.getOrder() << " " << s.getName() << " " << s.getHeight() << " " << s.getWeight() << endl;
		}
	}
	return 0;
}
  1. Version 2
//Version--2
//不幸的是,这一版也WA了,原因是答案错误,但实际输出看起来和答案一致
#include <bits/stdc++.h>
using namespace std;

class Student{
private:
	string order;
	string name;
    int height;
    int weight;
public: 
     Student (string order,string s,int x,int y):order(order),name(s),height(x),weight(y) { };
     ~Student(){ };
     
     int getHeight(){
     	return height;
	 }
	 int getWeight(){
	 	return weight;
	 }
	 string getName(){
	 	return name;
	 }
	string getOrder(){
		return order;
	}
	 const Student& operator=(const Student& r){
		 height = r.height;
		 name = r.name;
		 weight = r.weight;
		 return *this;
	 }
};
//改进:把宿舍封装成一个结构体,存入domi,这样有多少存多少,不浪费
typedef struct{
	vector<Student> stu;
	string order;
}room;
vector<room> domi;
int toint(string a){
	int sum=0;
	for(int i=0;i<6;i++){
		sum+=(a[i]-'0')*pow(10,i);
	}
	return sum;
} 

Student getMax(vector<Student> a){
	for (int i = 0; i < a.size();i++){
		for (int j = i + 1; j < a.size();j++){
			if(a[i].getHeight()>a[j].getHeight()){
				Student tmp = a[j];
				a[j] = a[i];
				a[i] = tmp;
			}
		}
	}
	return a[a.size() - 1];
}

int isIn(string o){
	for (int i = 0; i < domi.size();i++){
		if(o==domi[i].order){
			return i;
		}
	}
	return -1;
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n;i++){
		string s1, s2;
		int n1, n2;
		cin >> s1 >> s2 >> n1 >> n2;
		Student u(s1, s2, n1, n2);
		if(isIn(s1)!=-1){
			domi[isIn(s1)].stu.push_back(u);		//if the domitry exits
		}
		else{
			room r;
			r.order = s1;
			r.stu.push_back(u);
		}
	}
	//多了一步冒泡排序
	for (int i = 0; i < domi.size();i++){
		for (int j = i + 1; j < domi.size();j++){
			if(toint(domi[i].order)>toint(domi[j].order)){
				room tmp = domi[i];
				domi[i] = domi[j];
				domi[j] = tmp;
			}
		}
	}
	for (int i = 0; i < domi.size();i++){
		vector<Student> temp = domi[i].stu;
		Student s = getMax(temp);
		cout << s.getOrder() << " " << s.getName() << " " << s.getHeight() << " " << s.getWeight() << endl;
	}
	return 0;
}

好家伙,都到这份上了还错呢???
输出与样例对比
但是,一般情况下我是不怀疑题目本身合理性的,因此,分析一波之后结合之前做题的经验,是变量的类型设置错误,和题目要求不符!!!
在这里插入图片描述
区间说明什么,是整数啊!!
于是我把order的类型改成了int,那么来到第三版:
3.Version 3

//Version--3
//终于AC了
#include <bits/stdc++.h>
using namespace std;

class Student{
private:
	int order;
	string name;
    int height;
    int weight;
public: 
     Student (int order,string s,int x,int y):order(order),name(s),height(x),weight(y) { };
     ~Student(){ };
     
     int getHeight(){
     	return height;
	 }
	 int getWeight(){
	 	return weight;
	 }
	 string getName(){
	 	return name;
	 }
	int getOrder(){
		return order;
	}
	 const Student& operator=(const Student& r){
		 height = r.height;
		 name = r.name;
		 weight = r.weight;
		 return *this;
	 }
};
typedef struct{
	vector<Student> stu;
	int order;
}room;
vector<room> domi;
Student getMax(vector<Student> a){
	for (int i = 0; i < a.size();i++){
		for (int j = i + 1; j < a.size();j++){
			if(a[i].getHeight()>a[j].getHeight()){
				Student tmp = a[j];
				a[j] = a[i];
				a[i] = tmp;
			}
		}
	}
	return a[a.size() - 1];
}

int isIn(int o){
	for (int i = 0; i < domi.size();i++){
		if(o==domi[i].order){
			return i;
		}
	}
	return -1;
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n;i++){
		string  s2;
		int s1,n1, n2;
		cin >> s1 >> s2 >> n1 >> n2;
		Student u(s1, s2, n1, n2);
		if(isIn(s1)!=-1){
			domi[isIn(s1)].stu.push_back(u);		//if the domitry exits
		}
		else{
			room r;
			r.order = s1;
			r.stu.push_back(u);
			domi.push_back(r);
		}
	}
	for (int i = 0; i < domi.size();i++){
		for (int j = i + 1; j < domi.size();j++){
			if(domi[i].order>domi[j].order){
				room tmp = domi[i];
				domi[i] = domi[j];
				domi[j] = tmp;
			}
		}
	}
	for (int i = 0; i < domi.size();i++){
		vector<Student> temp = domi[i].stu;
		Student s = getMax(temp);
		cout <<setw(6)<<setfill('0')<<s.getOrder();
		//设置输出格式
		cout << " " << s.getName() << " " << s.getHeight() << " " << s.getWeight() << endl;
	}
	return 0;
}

结果:
在这里插入图片描述

反思:

从高人的代码中意识到,输出前面有0的整数,格式化就行。
读题时要注意题目对变量类型的限制!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值