题目:
读入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题解:
只需定义一个简单的类或者结构体,这里重载了赋值运算符。
另外值得注意的一点是使用直观的算法共需2n - 2次比较,而采用成对处理元素的算法至多3 ⌊n / 2⌋ 次比较(算法导论p.108)
代码:
#include <cstdio>
#include <cstring>
using namespace std;
class Student
{
public:
char name[15], id[15];
int score;
Student& operator =(const Student& a)
{
strcpy(this->name, a.name);
strcpy(this->id, a.id);
this->score = a.score;
return *this;
}
};
int main()
{
int n;
Student buf[100];
Student min, max;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%s %s %d", buf[i].name, buf[i].id, &buf[i].score);
}
// min.score = 101;
// max.score = -1;
// for(int i = 0; i < n; i++) //平凡算法
// {
// if(buf[i].score < min.score)
// {
// min = buf[i];
// }
// if(buf[i].score > max.score)
// {
// max = buf[i];
// }
// }
if(n % 2 == 1) //常系数更优的算法
{
min = buf[0];
max = buf[0];
for(int i = 1; i < n; i += 2)
{
if(buf[i].score < buf[i + 1].score)
{
if(buf[i].score < min.score)
min = buf[i];
if(buf[i + 1].score > max.score)
max = buf[i + 1];
}
else
{
if(buf[i + 1].score < min.score)
min = buf[i + 1];
if(buf[i].score > max.score)
max = buf[i];
}
}
}
else
{
for(int i = 0; i < n; i += 2)
{
if(buf[i].score < buf[i + 1].score)
{
if(buf[i].score < min.score)
min = buf[i];
if(buf[i + 1].score > max.score)
max = buf[i + 1];
}
else
{
if(buf[i + 1].score < min.score)
min = buf[i + 1];
if(buf[i].score > max.score)
max = buf[i];
}
}
}
printf("%s %s\n%s %s", max.name, max.id, min.name, min.id);
return 0;
}