40 lines
1.7 KiB
C++
40 lines
1.7 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
const int N = 1e5 + 10;
|
||
int m; // 算法种类数
|
||
int n; // 题目数
|
||
int k; // 目标掌握程度
|
||
int b[N]; // 代表每道题目已经取得的经验值
|
||
pair<int, int> a[N]; // 代表每道题目的frist:经验值,second:知识点
|
||
int c[N]; // 存储每个知识点选了多少道题
|
||
int cnt, ans, mx;
|
||
|
||
int main() {
|
||
cin >> m >> n >> k; // 输入算法种类数,题目数,目标掌握程度
|
||
for (int i = 1; i <= n; i++)
|
||
cin >> a[i].second; // 输入每道题目的知识点
|
||
|
||
for (int i = 1; i <= n; i++)
|
||
cin >> a[i].first; // 输入学习每道题目可以获取到的经验值
|
||
|
||
sort(a + 1, a + n + 1); // 按可以获取到的经验值最小到大排序
|
||
|
||
for (int i = n; i >= 1; i--) { // 倒序枚举,就是经验值最大到小
|
||
if (b[a[i].second] < k) { // 第a[i].second,也就是该知识点的已获得的经验值不够k
|
||
b[a[i].second] += a[i].first; // 这道题需要做一下,经验值增加
|
||
if (b[a[i].second] >= k)
|
||
cnt++; // 有多少个知识点达到了k
|
||
ans++; // 增加题数(记录使了多少个题目)
|
||
c[a[i].second]++; // 统计每个知识点的选择题数
|
||
mx = max(mx, c[a[i].second]); // 统计选择最多题的知识点选择了的题数
|
||
}
|
||
}
|
||
|
||
// ① 如果最终可以达标的算法数量不够m个,表示无解
|
||
// ② 如果选择最多的题数大于题目总数的一半,表示无解
|
||
if (cnt < m || n < mx * 2 - 1)
|
||
cout << -1 << endl; // 输出-1
|
||
else
|
||
cout << max(mx * 2 - 1, ans) << endl; // 输出最大值
|
||
return 0;
|
||
} |