2 条题解
-
2
二维数组存储信息,总分及平均成绩好求,但能囊括并列情况的名次排序还挺有意思。 两个要点,
一,用一个二元数组记录当前最大成绩及对应名次,由最高成绩逐个向下排序,如若与当前最大成绩相同,则名次相同;不同则名次即为该层循环的层数,并更新最大成绩及对应名次。
二,同时为避免扫描数组时,如遇并列最大值则只记录第一个,导致其余并列值无法被记录的情况,定义标记数组,已进行登记的同学下标将被标记筛出,每层循环先判断是否被筛出,再进行迭代当前最大值操作。
一点拙见,若有不足,请指正
#include<iostream> #include<iomanip> using namespace std; float a[101][7]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){//读入成绩,计算总分及平均值 for(int j=1;j<=3;j++) cin>>a[i][j]; a[i][4]=a[i][1]+a[i][2]+a[i][3]; a[i][5]=a[i][4]/3; } float max[2]={301,0};//定义数组记录当前最高成绩及对应名次 a[0][4]=0;//迭代最大值起点 int t[101],x=0;//定义标记数组,及栈顶指针 for(int i=1;i<=n;i++){//循环n次,每次寻找当前最大值及进行排名 int k=0;//每层循环定义该次最大成绩指针 for(int j=1;j<=n;j++){ int w=0;//初始化筛除标记 for(int g=0;g<x;g++)//遍历标记数组,存在则标记已筛出,退出本层迭代 if(j==t[g]) w=1; if(a[j][4]>a[k][4]&&a[j][4]<=max[0]&&w==0)//未筛,则迭代最大成绩指针 k=j; } t[x]=k;//标记筛出 x++; if(a[k][4]!=max[0]){//与上次筛出成绩不同,则登记该同学名次,并更新当前最大成绩及对应名次 a[k][6]=i; max[1]=i; max[0]=a[k][4]; } else//相同则登记并列名次 a[k][6]=max[1]; } for(int i=1;i<=n;i++){ for(int j=1;j<=5;j++) cout<<fixed<<setprecision(1)<<a[i][j]<<" "; cout<<fixed<<setprecision(0)<<a[i][6]<<endl; } }
信息
- ID
- 377
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 97
- 已通过
- 42
- 上传者