PAT 1036 Boys vs Girls (25)

本文介绍了一个程序设计问题,即如何找出所有男性学生中的最低分数与所有女性学生中的最高分数,并计算两者之间的差距。该程序使用了结构体来存储学生的姓名、性别、ID和分数,并通过不同的排序方式分别找出目标学生。

This time you are asked to tell the difference between the lowest grade of all the male students and the highest grade of all the female students.

Input Specification:

Each input file contains one test case. Each case contains a positive integer N, followed by N lines of student information. Each line contains a student's name, gender, ID and grade, separated by a space, where name and ID are strings of no more than 10 characters with no space, gender is either F (female) or M (male), and grade is an integer between 0 and 100. It is guaranteed that all the grades are distinct.

Output Specification:

For each test case, output in 3 lines. The first line gives the name and ID of the female student with the highest grade, and the second line gives that of the male student with the lowest grade. The third line gives the difference gradeF-gradeM. If one such kind of student is missing, output "Absent" in the corresponding line, and output "NA" in the third line instead.

Sample Input 1:

3
Joe M Math990112 89
Mike M CS991301 100
Mary F EE990830 95
Sample Output 1:
Mary EE990830
Joe Math990112
6
Sample Input 2:
1
Jean M AA980920 60
Sample Output 2:
Absent
Jean AA980920

NA

/* 考察结构体排序 QvQ..  
 * 午睡操场传来蝉的声音 多少年后也还是很好听~~
*/
#include "iostream"
#include "vector"
#include "cstring"
#include "string"
#include "stack"
#include "algorithm"
using namespace std;
struct Node {
	char name[11];
	char gender;
	char id[11];
	int grade;
};
bool cmp(const Node &n1, const Node &n2) {
	return n1.grade > n2.grade;
}
bool cmp1(const Node &n1, const Node &n2) {
	return n1.grade < n2.grade;
}
int main() {
	int n;
	vector<Node>v1, v2;
	cin >> n;
	for (int i = 0; i < n; i++) {
		Node node;
		cin >> node.name >> node.gender >> node.id >> node.grade;
		if (node.gender == 'M') {
			v1.push_back(node);
		}
		if (node.gender == 'F') {
			v2.push_back(node);
		}
	}
	sort(v1.begin(),v1.end(),cmp1);
	sort(v2.begin(), v2.end(), cmp);
	if (v2.size()) {
		cout << v2[0].name << " " << v2[0].id << endl;
	}
	else {
		cout << "Absent" << endl;
	}
	if (v1.size()) {
		cout << v1[0].name << " " << v1[0].id << endl;
	}
	else {
		cout << "Absent" << endl;
	}
	if(v1.size()&&v2.size()){
		cout << v2[0].grade - v1[0].grade << endl;
	}
	else {
		cout << "NA" << endl;
	}
	return 0;
}


### L1-095 分寝室 PAT考试题解及思路分析 #### 题目描述 学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 \( n_0 \) 位、男生 \( n_1 \) 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。现需按照特定规则完成寝室的自动分配。 #### 规则说明 - 男女生不能混住; - 不允许单人住一间寝室; - 对每种性别的学生,每间寝室入住的人数都必须相同; - 要求两种性别每间寝室入住的人数差最小[^2]。 #### 解决方案 为了实现上述目标,可以通过枚举法找到符合条件的最佳分配方式: 1. **初始化变量** 定义 `min_diff` 记录当前最小人数差异,初始设为无穷大。 2. **遍历可能的房间配置** 使用双重循环分别尝试不同的男女寝室安排组合 `(i, j)` ,其中 i 表示每个女寝容纳多少名女生,j 则对应于男寝情况。 3. **验证合法性并更新最优解** 如果某次迭代中的配置合法(即能恰好填满所有寝室),计算该配置下两性别人数之差并与现有记录比较,保存更优的结果。 4. **输出结果** 以下是 Python 实现代码: ```python def assign_rooms(n, girls, boys): min_diff = float('inf') best_girls_per_room = 0 best_boys_per_room = 0 for gpr in range(2, girls + 1): # Girls per room from 2 to max possible if girls % gpr != 0 or (girls // gpr) > n: continue remaining_rooms = n - (girls // gpr) for bpr in range(2, boys + 1): # Boys per room from 2 to max possible if boys % bpr != 0 or (boys // bpr) > remaining_rooms: continue current_diff = abs(gpr - bpr) if current_diff < min_diff: min_diff = current_diff best_girls_per_room = gpr best_boys_per_room = bpr return f"{best_girls_per_room} {best_boys_per_room}" # Example usage print(assign_rooms(int(input()), int(input().split()[0]), int(input().split()[1]))) ``` 此算法通过穷尽所有可能性来寻找最接近的理想状态,并最终返回使得两者差距尽可能小的一组参数作为答案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值