这是一个菜鸡的挣扎过程!!不要嫌弃本辣鸡55555
输入格式:
首先输入一个整型数n (1<=n<=1000000),表示n位同学。
紧跟着n行输入,每一行格式为:宿舍号,name,height,weight。
宿舍号的区间为[0,999999], name 由字母组成,长度小于16,height,weight为正整数。
输出格式:
按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学
分析:
题目要求是写一个Student类,这很好办。接着无论是按照宿舍号从小到大排序还是输出最高的同学的身高,本质都是排序问题。只是我的问题在于用什么容器来存放学生,宿舍的信息。以及如果宿舍号以字符串形式输入的话,该如何排序。
以下是3版代码,3种思路,可以解开疑惑:
- 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;
}
- 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的整数,格式化就行。
读题时要注意题目对变量类型的限制!