C++版浙大PAT乙级1015(25分)

https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312

3.9改进版本

#include<iostream>
#include<algorithm>
using namespace std;

struct student{
	int number;
	int de;
	int cai;
	int total;
	int category;
};

bool cmp(student a, student b){
	if(a.category != b.category)
		return a.category < b.category;
	if(a.total != b.total)
		return a.total > b.total;
	if(a.de != b.de)
		return a.de > b.de;
	if(a.number != b.number)
		return a.number < b.number;
}

int main(){
	int n, l, h, k=0;
	cin >> n >> l >> h;
	student stus[n];
	for(int i=0; i<n; i++){
		cin >> stus[k].number >> stus[k].de >> stus[k].cai;
		if(stus[k].de < l || stus[k].cai < l){
			continue;
		}
		stus[k].total = stus[k].de + stus[k].cai;
		if(stus[k].de >= h && stus[k].cai >= h){
			stus[k].category = 1;
		}else if(stus[k].de >= h && stus[k].cai < h){
			stus[k].category = 2;
		}else if(stus[k].de < h && stus[k].cai < h && stus[k].de >= stus[k].cai){
			stus[k].category = 3;
		}else{
			stus[k].category = 4;
		}
		k ++;
	}
	sort(stus, stus+k, cmp);
	cout << k << endl;
	for(int i=0; i<k; i++){
		cout << stus[i].number << " " << stus[i].de << " " << stus[i].cai << endl;
	}
	return 0;
}

原版

这题输入每个考生的考号、德分、才分,然后把考生成绩分为四等,每一等要进行排序,即按总分降序排列,总分相同的按德分降序排列,德分相同的按考号升序排列。

我的代码先把考生分进四个数组,对每个数组用快排后再输出。

#include<iostream>
using namespace std;

// 快速排序
void quick_sort(int arr[][3], int l, int r)
{
    if (l < r)
    {
    	int i = l, j = r, x[3];
    	x[0] = arr[l][0];
    	x[1] = arr[l][1];
    	x[2] = arr[l][2];
    	while(i < j){
			while(i < j && (arr[j][1]+arr[j][2] < x[1]+x[2] || (arr[j][1]+arr[j][2] == x[1]+x[2] && arr[j][1] < x[1]) || (arr[j][1]+arr[j][2] == x[1]+x[2] && arr[j][1] == x[1] && arr[j][0] > x[0]))){
	            j--;
			}
	        if(i < j) 
	        {
	            arr[i][0] = arr[j][0];
	            arr[i][1] = arr[j][1];
	            arr[i++][2] = arr[j][2];
	        }
	        while(i < j && (arr[i][1]+arr[i][2] > x[1]+x[2] || (arr[i][1]+arr[i][2] == x[1]+x[2] && arr[i][1] > x[1]) || (arr[i][1]+arr[i][2] == x[1]+x[2] && arr[i][1] == x[1] && arr[i][0] < x[0]))){
	            i++;  
	        }
	        if(i < j) 
	        {
	            arr[j][0] = arr[i][0];
	            arr[j][1] = arr[i][1];
	            arr[j--][2] = arr[i][2];
	        }
		}
		arr[i][0] = x[0];
		arr[i][1] = x[1];
		arr[i][2] = x[2];
        quick_sort(arr, l, i - 1); 
        quick_sort(arr, i + 1, r);
    }
}

int main(){
	int n, l, h, a, b, c;
	int p1=0, p2=0, p3=0, p4=0;
	cin >> n >> l >> h;
	int stu1[n][3], stu2[n][3], stu3[n][3], stu4[n][3];
	for(int i=0; i<n; i++){
		cin >> a >> b >> c;
		if(b>=h && c>=h){
			stu1[p1][0] = a;
			stu1[p1][1] = b;
			stu1[p1++][2] = c;
		}
		else if(b>=h && c>=l){
			stu2[p2][0] = a;
			stu2[p2][1] = b;
			stu2[p2++][2] = c;
		}else if(b>=l && c>=l && b>=c){
			stu3[p3][0] = a;
			stu3[p3][1] = b;
			stu3[p3++][2] = c;
		}else if(b>=l && c>=l){
			stu4[p4][0] = a;
			stu4[p4][1] = b;
			stu4[p4++][2] = c;
		}
	}

	cout << p1+p2+p3+p4 << endl;

	quick_sort(stu1, 0, p1);
	quick_sort(stu2, 0, p2);
	quick_sort(stu3, 0, p3);
	quick_sort(stu4, 0, p4);

	for(int i=0;i<p1;i++){
		cout << stu1[i][0] << " " << stu1[i][1] << " " << stu1[i][2] << endl;
	}
	for(int i=0;i<p2;i++){
		cout << stu2[i][0] << " " << stu2[i][1] << " " << stu2[i][2] << endl;
	}
	for(int i=0;i<p3;i++){
		cout << stu3[i][0] << " " << stu3[i][1] << " " << stu3[i][2] << endl;
	}
	for(int i=0;i<p4;i++){
		cout << stu4[i][0] << " " << stu4[i][1] << " " << stu4[i][2] << endl;
	}
	return 0;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值