当前位置: 首页 > news >正文

2025-7-14-C++ 学习 排序(2)

文章目录

  • 2025-7-14-C++ 学习 排序(2)
  • P1059 [NOIP 2006 普及组] 明明的随机数
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例 #1
      • 输入 #1
      • 输出 #1
    • 说明/提示
    • 提交代码
  • P1093 [NOIP 2007 普及组] 奖学金
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例 #1
      • 输入 #1
      • 输出 #1
    • 输入输出样例 #2
      • 输入 #2
      • 输出 #2
    • 提交代码
  • P1781 宇宙总统
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例 #1
      • 输入 #1
      • 输出 #1
    • 说明/提示
    • 提交代码
  • P2676 [USACO07DEC] Bookshelf B
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例 #1
      • 输入 #1
      • 输出 #1
    • 说明/提示
    • 提交代码

2025-7-14-C++ 学习 排序(2)

  排序,继续。

P1059 [NOIP 2006 普及组] 明明的随机数

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 NNN111100010001000 之间的随机整数 (N≤100)(N\leq100)(N100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式

输入有两行,第 111 行为 111 个正整数,表示所生成的随机数的个数 NNN

222 行有 NNN 个用空格隔开的正整数,为所产生的随机数。

输出格式

输出也是两行,第 111 行为 111 个正整数 MMM,表示不相同的随机数的个数。

222 行为 MMM 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

输入输出样例 #1

输入 #1

10
20 40 32 67 40 20 89 300 400 15

输出 #1

8
15 20 32 40 67 89 300 400

说明/提示

NOIP 2006 普及组 第一题

提交代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {int n;cin >> n;vector<int> numbers(n);for (int i = 0; i < n; i++) {cin >> numbers[i];}// 排序sort(numbers.begin(), numbers.end());// 去重vector<int> uniqueNumbers;if (!numbers.empty()) {uniqueNumbers.push_back(numbers[0]);for (int i = 1; i < n; i++) {if (numbers[i] != numbers[i - 1]) {uniqueNumbers.push_back(numbers[i]);}}}// 输出结果cout << uniqueNumbers.size() << endl;for (int num : uniqueNumbers) {cout << num << " ";}cout << endl;return 0;
}    

P1093 [NOIP 2007 普及组] 奖学金

题目背景

NOIP2007 普及组 T1

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 555 名学生发奖学金。期末,每个学生都有 333 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 333 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。

注意,在前 555 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7 279  
5 279

这两行数据的含义是:总分最高的两个同学的学号依次是 777 号、555 号。这两名同学的总分都是 279279279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 777 的学生语文成绩更高一些。

如果你的前两名的输出数据是:

5 279  
7 279

则按输出错误处理,不能得分。

输入格式

n+1n+1n+1 行。

111 行为一个正整数 n≤300n \le 300n300,表示该校参加评选的学生人数。

222n+1n+1n+1 行,每行有 333 个用空格隔开的数字,每个数字都在 000100100100 之间。第 jjj 行的 333 个数字依次表示学号为 j−1j-1j1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1∼n1\sim n1n(恰好是输入数据的行号减 111)。

保证所给的数据都是正确的,不必检验。

输出格式

555 行,每行是两个用空格隔开的正整数,依次表示前 555 名学生的学号和总分。

输入输出样例 #1

输入 #1

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

输出 #1

6 265
4 264
3 258
2 244
1 237

输入输出样例 #2

输入 #2

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

输出 #2

8 265
2 264
6 264
1 258
5 258

提交代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;struct Student {int id;int chinese;int math;int english;int total;
};// 自定义比较函数
bool compare(const Student& a, const Student& b) {if (a.total != b.total) {return a.total > b.total; // 总分高的优先}if (a.chinese != b.chinese) {return a.chinese > b.chinese; // 语文成绩高的优先}return a.id < b.id; // 学号小的优先
}int main() {int n;cin >> n;vector<Student> students(n);for (int i = 0; i < n; i++) {students[i].id = i + 1;cin >> students[i].chinese >> students[i].math >> students[i].english;students[i].total = students[i].chinese + students[i].math + students[i].english;}// 排序sort(students.begin(), students.end(), compare);// 输出前5名for (int i = 0; i < 5 && i < n; i++) {cout << students[i].id << " " << students[i].total << endl;}return 0;
}    

P1781 宇宙总统

题目描述

地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 nnn 个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。

输入格式

第一行为一个整数 nnn,代表竞选总统的人数。

接下来有 nnn 行,分别为第一个候选人到第 nnn 个候选人的票数。

输出格式

共两行,第一行是一个整数 mmm,为当上总统的人的号数。

第二行是当上总统的人的选票。

输入输出样例 #1

输入 #1

5
98765
12365
87954
1022356
985678

输出 #1

4
1022356

说明/提示

票数可能会很大,可能会到 100100100 位数字。

1≤n≤201 \leq n \leq 201n20

提交代码

#include <iostream>
#include <string>
#include <vector>
using namespace std;// 比较两个大数字字符串的大小
bool isGreater(const string& a, const string& b) {if (a.length() != b.length()) {return a.length() > b.length();}return a > b;
}int main() {int n;cin >> n;string maxVote = "";int maxIndex = 0;for (int i = 1; i <= n; i++) {string vote;cin >> vote;if (isGreater(vote, maxVote)) {maxVote = vote;maxIndex = i;}}cout << maxIndex << endl;cout << maxVote << endl;return 0;
}    

P2676 [USACO07DEC] Bookshelf B

题目描述

Farmer John 最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。

所有 N(1≤N≤20,000)N(1 \le N \le 20,000)N(1N20,000) 头奶牛都有一个确定的身高 Hi(1≤Hi≤10,000)H_i(1 \le H_i \le 10,000)Hi(1Hi10,000)。设所有奶牛身高的和为 SSS。书架的高度为 BBB,并且保证 1≤B≤S<2,000,000,0071 \le B \le S < 2,000,000,0071BS<2,000,000,007

为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。

显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。

输入格式

  • 111 行:2 个用空格隔开的整数:NNNBBB
  • 2…N+12\dots N+12N+1 行:第 i+1i+1i+1 行是 111 个整数:HiH_iHi

输出格式

  • 111 行:输出 111 个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部。

输入输出样例 #1

输入 #1

6 40
6
18
11
13
19
11

输出 #1

3

说明/提示

输入说明:

一共有 666 头奶牛,书架的高度为 404040,奶牛们的身高在 6…196\dots19619 之间。

输出说明:

一种只用 333 头奶牛就达到高度 404040 的方法:18+11+1318+11+1318+11+13。当然还有其他方法,在此不一一列出了。

提交代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {int n, b;cin >> n >> b;vector<int> heights(n);for (int i = 0; i < n; i++) {cin >> heights[i];}// 从大到小排序sort(heights.begin(), heights.end(), greater<int>());int sum = 0;int count = 0;// 贪心策略:优先选择最高的奶牛for (int height : heights) {sum += height;count++;if (sum >= b) {break;}}cout << count << endl;return 0;
}    
http://www.lryc.cn/news/588573.html

相关文章:

  • IoC容器深度解析:架构、原理与实现
  • 驱动开发系列60- Vulkan 驱动实现-SPIRV到HW指令的实现过程(1)
  • 分支战略论:Git版本森林中的生存法则
  • PHP password_verify() 函数
  • 什么是微服务?-核心思想:化整为零,各自为战
  • Node.js + Express的数据库AB View切换方案设计
  • 【EM算法】三硬币模型
  • 自动微分模块
  • Class9简洁实现
  • JavaScript进阶篇——第二章 高级特性核心
  • JavaScript进阶篇——第一章 作用域与垃圾回收机制
  • 力扣 hot100 Day44
  • java基础(day07)
  • 板凳-------Mysql cookbook学习 (十一--------10)
  • 06【C++ 初阶】类和对象(上篇) --- 初步理解/使用类
  • ThreadLocal内部结构深度解析
  • 《大数据技术原理与应用》实验报告三 熟悉HBase常用操作
  • 每天一个前端小知识 Day 31 - 前端国际化(i18n)与本地化(l10n)实战方案
  • html js express 连接数据库mysql
  • Java:继承和多态(必会知识点整理)
  • 为什么资深C++开发者大部分选vector?揭秘背后的硬核性能真相!
  • 9.服务容错:构建高可用微服务的核心防御
  • #Paper Reading# Apple Intelligence Foundation Language Models
  • 微服务初步入门
  • 量子计算新突破!阿里“太章3.0”实现512量子比特模拟(2025中国量子算力巅峰)
  • 【算法训练营Day12】二叉树part2
  • 《大数据技术原理与应用》实验报告二 熟悉常用的HDFS操作
  • 【小白量化智能体】应用5:编写通达信股票交易指标及生成QMT自动交易Python策略程序
  • UDP协议的端口161怎么检测连通性
  • 【PY32】如何使用 J-Link 和 MDK 开发调试 PY32 MCU