[C++] 洛谷B3959(GESP2024三月四级)做题
题解目录
- B3959 [GESP202403 四级] 做题 - 题干
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例 #1
- 输入 #1
- 输出 #1
- 说明/提示
- 数据规模与约定
- B3959 [GESP202403 四级] 做题 - 题解
B3959 [GESP202403 四级] 做题 - 题干
题目描述
小杨同学为了提高自己的实力制定了做题计划,在第 k k k 天时,他必须要完成 k k k 道题,否则他就会偷懒。
小杨同学现在找到了一个题库,一共有 n n n 套题单,每一套题单中有一定数量的题目。但是他十分挑剔,每套题单他只会使用一次,每一天也只能使用一套题单里的题目,之后那套题单就会弃之不用。对于每套题单,他不必完成题单内所有的题。
那么问题来了,小杨同学最多做题几天才偷懒呢?
输入格式
第一行,一个整数为 n n n,表示有多少套题单。
第二行 n n n 个整数 a 1 , a 2 , … a n a_1, a_2, \dots a_n a1,a2,…an,分别表示每套题单有多少道题。
输出格式
输出一行一个整数表示答案。
输入输出样例 #1
输入 #1
4
3 1 4 1
输出 #1
3
说明/提示
数据规模与约定
对全部的测试数据,保证 1 ≤ n ≤ 10 6 1 \leq n \leq 10^6 1≤n≤106, 1 ≤ a i ≤ 10 9 1 \leq a_i \leq 10^9 1≤ai≤109。
B3959 [GESP202403 四级] 做题 - 题解
这是一个贪心算法,通过排序后从小到大依次检查每个题单能否满足第 k + 1 k+1 k+1天的需求。排序后可以确保我们优先使用题目数量少的题单来满足早期的天数需求,从而最大化总天数。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {int n;cin >> n;vector<long long> a(n);for (int i = 0; i < n; i++) {cin >> a[i];}sort(a.begin(), a.end());int k = 0;for (int i = 0; i < n; i++) {if (a[i] >= k + 1) {k++;}}cout << k << endl;return 0;
}