C++:问题C:网课排序-创新互联

前言

记录一道排序问题的思考

英吉沙ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!题目 描述

网课终于结束了。
很多同学也回到学校上课了。
HZSjYJ决定对网课上的好的前五名的学校进行奖励和宣传。他们挑选了语文数学英语三门课,并对每个学校三门课进行了打分。
当然奖励排名规则如下:
1 三门课总分高的排在前面
2 总分相同,则语文高的排在前面
3 如果总分和语文都相同,则序号在前的排在前面(序号是JYJ事先定好的,就是输入顺序)

输入

第一行输入一个整数n,表示学校数
然后是n行,每行3个数字,分别代表1个学校的语文数学英语的打分

输出

输出5行,分别是排名前5的学校(按照排名输出),每行2个整数,为序号和总分

样例

输入

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

输出

6 265
4 264
3 258
2 244
1 237
分析

这道题当然可以基于排序去做,写一个快排,然后改变其中排序的逻辑,但是这样做的话就要对整个输入的数组进行存储和排序,因为这里只要前几名的一个排序结果,所以不妨使用另外一种思路来解决这类问题

只存储前几名,每次只和前几名进行比较

#includeusing namespace std;
int main(){int n;
	int tl[6]={0},ch[6]={0},ID[6]={0};
	//freopen("in.in","r",stdin);
	//freopen("out.out","w",stdout)  ;                                                                                                            
	cin>>n;	
	for(int i=0;iint totals,x,y,z;
		cin>>x>>y>>z;
		tl[5]=x+y+z; ch[5]=x;	ID[5]=i+1;
		for(int j=4;j>=0;j--){	if(tl[j]<=tl[j+1]){		if(tl[j+1]>tl[j] ||(tl[j]==tl[j+1] && ch[j+1]>ch[j] ))
				{int temp;
					temp=tl[j];tl[j]=tl[j+1];tl[j+1]=temp;
					temp=ch[j];ch[j]=ch[j+1];ch[j+1]=temp;
					temp=ID[j];ID[j]=ID[j+1];ID[j+1]=temp;					
				}
			}
			else break;
		}				
	}	
	
	for(int i=0;i<5;i++)
		cout<

时间复杂度:O(n)
空间复杂度:O(1)

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:C++:问题C:网课排序-创新互联
链接分享:http://cdiso.cn/article/ccjehg.html