题目描述
读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入描述:
每个测试输入包含1个测试用例,格式为
第1行:正整数n
第2行:第1个学生的姓名 学号 成绩
第3行:第2个学生的姓名 学号 成绩
… … …
第n+1行:第n个学生的姓名 学号 成绩
其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出描述:
对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低学生的姓名和学号,字符串间有1空格。
输入例子:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出例子:
Mike CS991301
Joe Math990112
(题目来自牛客网PAT乙级练习题1036,由小小
上传)
我的想法:
题目要求存储两组数据,一个是最大的,一个是最小的。我们还需要另一个来存储当前的输入。所以我们一共需要三组数据空间,每组数据都是三个元素“名字,学号,成绩”,我们可以用结构体来做,这里比较简单,我就直接用了9个变量。第一次输入的值我们把它即当成最大,也当成最小(因为只有一个啊),之后的输入,再大的覆盖大的,小的覆盖小的。就有了下面:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s_M,s_m,t; //names
string ind_M,ind_m,ind_t; //indexs
int score_M,score_m,score_t; //scores
int n;
cin>>n;
int i=1;
cin>>t>>ind_t>>score_t;
s_m=t; ind_m=ind_t; score_m=score_t;
s_M=t; ind_M=ind_t; score_M=score_t;
for(;i<n;++i){
cin>>t>>ind_t>>score_t;
if(score_t>score_M){
s_M=t; ind_M=ind_t; score_M=score_t;
}else if(score_t<score_m){
s_m=t; ind_m=ind_t; score_m=score_t;
}
}
cout<<s_M<<' '<<ind_M<<endl;
cout<<s_m<<' '<<ind_m;
return 0;
}
上面程序8552Kb内存,牛客网C语言最优解是8452Kb。还真是凑巧,和我整整差了100Kb,看起来我的路途还很遥远啊。下面贴一个8452Kb的代码,来自 “Uncle_Sugar”
# include <cstdio>
# include <iostream>
using namespace std;
struct stu
{
char name[15],ID[15];
int grade;
void read()
{
cin >> name >> ID >> grade;
}
void print()
{
printf("%s %s\n",name,ID);
}
};
int main()
{
int n;
stu Max,Min,temp;
cin >> n;
for (int i=0;i<n;i++)
{
temp.read();
if (i==0)
{
Max = Min = temp;
}
else if (temp.grade>Max.grade)
Max = temp;
else if (temp.grade<Min.grade)
Min = temp;
}
Max.print();
Min.print();
}
代码不同,但原理差不多的,我更想弄明白,为什么他的内存占用会少这么多,望高人赐教。