PAT乙级1004——成绩排名
题目:
题目详情 - 1004 成绩排名 (20 分) (pintia.cn)
我的思路很简单:
1.构造结构体,每个结构体里面储存学生的三个参数:姓名,学号,分数
2.构造结构体数组(这里使用到动态数组)
2.通过排序算法(可以是冒泡,快速,这里选择了冒泡排序,虽然时间复杂度会比较高)将分数排名,并将整个结构体数组里面的成员排名
4.输出分数最高的和分数最低的
尽管运行出来了正确的结果,但还是有一个测试点没有通过,很奇怪:

下面是代码:
#include <iostream> using namespace std; //构造结构体 typedef struct StuList { char name[12]; char id[12]; int score; }Slist; int main() { int n,i,j; cin>>n; //一共有n个学生 Slist *ptr; //构造一个结构体指针PtrS ptr=new Slist [n]; //这个指针指向一个动态数组 for (i=0;i<n;i++) { cin>>(ptr+i)->name; cin>>(ptr+i)->id; cin>>(ptr+i)->score; } for (i=0;i<n-1;i++) { for (j=0;j<n-1;j++) { if (((ptr+i)->score)<((ptr+i+1)->score)) //需要从大到小排序 { Slist temp=*(ptr+i); *(ptr+i)=*(ptr+i+1); *(ptr+i+1)=temp; } } } cout<<(ptr)->name<<" "<<(ptr)->id<<endl; cout<<(ptr+n-1)->name<<" "<<(ptr+n-1)->id; return 0; }
下面是我看到的别人的回答,很简单的感觉:
#include <iostream> #include <string> using namespace std; int main() { int n, max = -1, min = 101, score; //初始化最大值和最小值,这两个值都是正常成绩取不到的值 cin >> n; string maxname, minname; //最高分的同学的姓名和最低分的姓名 string maxnum, minnum; //最高分的同学的学号,最低分的学号 string name,num; //姓名和学号 for (int i = 0; i < n; i++) { cin >> name >> num >>score; if (max < score) { max = score; maxname = name; maxnum = num; } if (min > score) { min = score; minname = name; minnum = num; } } cout << maxname << " " << maxnum << endl; cout << minname << " " << minnum; return 0; }
这个方式为什么更简单呢?
简言之:进来一个比一个,不需要全部都存储起来再排序
这个方法的缺点:设置的变量比较多,容易混淆,如果题目要求输出前三名就不好办了
总结:
看题目需求:如果只需要最大最小值,那么就进来一个比一个就好了。
本文来自博客园,作者:EowynTang,转载请注明原文链接:https://www.cnblogs.com/tangcoder/p/15591263.html

浙公网安备 33010602011771号