PAT甲级_1028 List Sorting (25 分)|1029 Median (25 分)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44705116/article/details/102616929

1、1028 List Sorting (25 分)

题目大意:输入几个学生的信息,按照规定的顺序排列输出学生信息列表。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

struct stu {
	int id, grade;
	char name[10] = "";
};

bool cmp1(stu a, stu b) {
	return a.id < b.id;
}

bool cmp2(stu a, stu b) {
	if(strcmp(a.name, b.name)==0) return a.id<b.id;
	return strcmp(a.name, b.name)<=0;
}

bool cmp3(stu a, stu b) {
	if(a.grade==b.grade) return a.id<b.id;
	return a.grade < b.grade;
}

int main() {
	int n, c;
	scanf("%d%d", &n, &c);
	stu sb[100010];
	for (int i = 0; i < n; i++) {
		scanf("%d %s %d", &sb[i].id, &sb[i].name, &sb[i].grade);
	}
	
	if (c == 1) sort(sb, sb+n, cmp1);
	if (c == 2) sort(sb, sb+n, cmp2);
	if (c == 3) sort(sb, sb+n, cmp3);
	for (int i = 0; i < n; i++) {
		printf("%06d %s %d\n", sb[i].id, sb[i].name, sb[i].grade);
	}
}

需要注意的情况是要在姓名或是成绩一样的时候,改用另一项数据进行排序。

2、1029 Median (25 分)

题目大意:给出两个数列,得到数列合并后按大小排列的最中间的数。

#include<iostream>
using namespace std;
int main(){
    int n, m;
    scanf("%d", &n);
    int x1[n];
    for(int i=0;i<n;i++){
        scanf("%d", &x1[i]);
    }
    x1[n]=2147483647;

由于第一个数组的最后一位的后一位在作为判断条件的时候会被遍历到,给它赋int的最大值,即0x7fffffff。

动态加入第二个数组的元素,组成最终的数组,在抵达(n+m+1)/2时输出元素;

分情况编写输出模块,分别在x1没输出完、第二个数列输出完时进行输出;


    scanf("%d", &m);
    int temp, count=0, fk=(n+m+1)/2, j=0;
    for(int i=0;i<m;i++){
        scanf("%d", &temp);
        while(x1[j]<temp){
            count++;  
            if(count==fk) cout<<x1[j];
			j++;
        }
        count++;
        if(count==fk) cout<<temp;
    }
    for(int i=j;i<n;i++){
    	count++;
        if(count==fk) cout<<x1[i];
    }
}

“不要了!!!”

猜你喜欢

转载自blog.csdn.net/weixin_44705116/article/details/102616929