2 条题解

  • 2
    @ 2023-10-3 18:01:23

    二维数组存储信息,总分及平均成绩好求,但能囊括并列情况的名次排序还挺有意思。 两个要点,

    一,用一个二元数组记录当前最大成绩及对应名次,由最高成绩逐个向下排序,如若与当前最大成绩相同,则名次相同;不同则名次即为该层循环的层数,并更新最大成绩及对应名次。

    二,同时为避免扫描数组时,如遇并列最大值则只记录第一个,导致其余并列值无法被记录的情况,定义标记数组,已进行登记的同学下标将被标记筛出,每层循环先判断是否被筛出,再进行迭代当前最大值操作。

    一点拙见,若有不足,请指正

    #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
    上传者