PAT 乙级 1015

题目

    题目地址:PAT 乙级 1015

 

题解

    常规题,难点在于理清楚排序规则,通过比较简洁的方式进行编码;

    在这里我选择使用vector进行存储,并使用sort方法排序,因为本题不是简单按照大小排序,因此这里需要再次理解sort方法中的第三个参数,以及它的使用细节;

    关于sort的具体使用方法,可以在我之前的博文查看;

    还需要最后说明的一点问题是:尽量使用 printf 和 scanf,减少 cout 和 cin 的使用,之前用cin和cout,结果时间超限了……

 

代码

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 struct Stu {
 7     int num;
 8     int s1;
 9     int s2;
10 };
11 
12 bool comp(Stu x, Stu y) {
13     if (x.s1 + x.s2 > y.s1 + y.s2) return true;
14     else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true;
15     else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true;
16     else return false;
17 }
18 
19 int main() {
20     vector<Stu> stu1, stu2, stu3, stu4;
21     int tmp_num, tmp_s1, tmp_s2;
22     Stu tmp_stu;
23     int N = 0, L = 0, H = 0;
24     scanf("%d %d %d", &N, &L, &H);
25     while (N--) {
26         scanf("%d %d %d", &tmp_num, &tmp_s1, &tmp_s2);
27         tmp_stu.num = tmp_num;
28         tmp_stu.s1 = tmp_s1;
29         tmp_stu.s2 = tmp_s2;
30         if (tmp_stu.s1 >= L && tmp_stu.s2 >= L) {
31             if (tmp_stu.s1 >= H && tmp_stu.s2 >= H) stu1.push_back(tmp_stu);
32             else if (tmp_stu.s1 >= H && tmp_stu.s2 < H) stu2.push_back(tmp_stu);
33             else if (tmp_stu.s1 < H && tmp_stu.s2 < H && tmp_stu.s1 >= tmp_stu.s2) stu3.push_back(tmp_stu);
34             else stu4.push_back(tmp_stu);
35         }
36     }
37     sort(stu1.begin(), stu1.end(), comp);
38     sort(stu2.begin(), stu2.end(), comp);
39     sort(stu3.begin(), stu3.end(), comp);
40     sort(stu4.begin(), stu4.end(), comp);
41     printf("%d\n", stu1.size() + stu2.size() + stu3.size() + stu4.size());
42     for (int i = 0; i < stu1.size(); i++)
43         printf("%d %d %d\n", stu1[i].num, stu1[i].s1, stu1[i].s2);
44     for (int i = 0; i < stu2.size(); i++)
45         printf("%d %d %d\n", stu2[i].num, stu2[i].s1, stu2[i].s2);
46     for (int i = 0; i < stu3.size(); i++)
47         printf("%d %d %d\n", stu3[i].num, stu3[i].s1, stu3[i].s2);
48     for (int i = 0; i < stu4.size(); i++)
49         printf("%d %d %d\n", stu4[i].num, stu4[i].s1, stu4[i].s2);
50 
51     return 0;
52 }

    这里的代码感觉还是有些冗余,尤其是排序和输入的部分,因此再贴上经过微小改进后的代码;

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 struct Stu {
 7     int num;
 8     int s1;
 9     int s2;
10 };
11 
12 bool comp(Stu x, Stu y) {
13     if (x.s1 + x.s2 > y.s1 + y.s2) return true;
14     else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true;
15     else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true;
16     else return false;
17 }
18 
19 int main() {
20     vector<Stu> stu[4];
21     int tmp_num, tmp_s1, tmp_s2;
22     Stu tmp_stu;
23     int N = 0, L = 0, H = 0;
24     scanf("%d %d %d", &N, &L, &H);
25     while (N--) {
26         scanf("%d %d %d", &tmp_num, &tmp_s1, &tmp_s2);
27         tmp_stu.num = tmp_num;
28         tmp_stu.s1 = tmp_s1;
29         tmp_stu.s2 = tmp_s2;
30         if (tmp_stu.s1 >= L && tmp_stu.s2 >= L) {
31             if (tmp_stu.s1 >= H && tmp_stu.s2 >= H) stu[0].push_back(tmp_stu);
32             else if (tmp_stu.s1 >= H && tmp_stu.s2 < H) stu[1].push_back(tmp_stu);
33             else if (tmp_stu.s1 < H && tmp_stu.s2 < H && tmp_stu.s1 >= tmp_stu.s2) stu[2].push_back(tmp_stu);
34             else stu[3].push_back(tmp_stu);
35         }
36     }
37     printf("%d\n", stu[0].size() + stu[1].size() + stu[2].size() + stu[3].size());
38     for (int i = 0; i < 4; i++) {
39         sort(stu[i].begin(), stu[i].end(), comp);
40         for (int j = 0; j < stu[i].size(); j++)
41            printf("%d %d %d\n", stu[i][j].num, stu[i][j].s1, stu[i][j].s2);
42     }
43 
44     return 0;
45 }

    这样整体代码就简洁了一些,看起来也没有那么臃肿

转载于:https://www.cnblogs.com/moujun1001/p/9970385.html

### 关于PAT乙级Python 1015题目 针对PAT乙级中的Python 1015题目,虽然直接关于此题目的具体解析未在提供的参考资料中明确提及[^2],但是可以基于PAT乙级的一般解题模式以及编程竞赛的特点来构建解答框架。 #### 题目概述 通常情况下,PAT乙级的题目会围绕基础算法、字符串处理、简单数学运算等方面展开。对于编号为1015的具体题目,在缺乏确切描述的情况下,假设该题目属于常见的编程挑战之一,比如涉及数组操作、字符串转换或是简单的逻辑判断等。 #### 解题思路 考虑到PAT系列试题的设计原则,解决这类问题的关键在于理解题目要求并选择合适的数据结构算法: - **仔细阅读题目说明**:确保完全明白输入输出的要求。 - **设计合理的解决方案**:依据题目特性决定采用何种方法最有效率地解决问题。 - **编写简洁高效的代码**:利用Python的优势简化语法表达,提高程序可读性和执行效率。 - **测试调试**:通过多个样例验证自己的答案是否正确无误。 #### 代码实现 下面提供一段通用性的Python代码模板作为参考,适用于大多数PAT类型的编程任务(请注意实际比赛中应严格按照官方给定的任务细节调整参数设置): ```python def solve_problem(input_data): result = [] # 存储最终的结果列表 for item in input_data: processed_item = process(item) # 对单个元素进行必要的预处理 computed_value = compute(processed_item) # 执行核心计算逻辑 result.append(computed_value) return format_output(result) if __name__ == "__main__": inputs = read_input() # 获取用户输入或其他形式的数据源 output = solve_problem(inputs) print(output) # 或者按照特定格式写出到文件/标准输出流 ``` 这段伪代码展示了如何接收外部数据、逐项处理并将结果整理成期望的形式返回或打印出来。具体的`process()`、`compute()`函数定义需根据实际情况定制化开发;而`read_input()`则负责获取初始条件或案例集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值