完成一半题目
作者: Turbo
时间限制: 1s
章节: 课程设计
问题描述
有 N 位扣友参加了微软与力扣举办的「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。
若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。
示例 1:
输入:
4
2 1 6 2
输出:1
解释:共有 2 位扣友,在 4 道题目中选择 2 题。
可选择完成知识点类型为 2 的题目时,此时仅一种知识点类型,因此至少包含 1 种知识点类型。
示例 2:
输入:
12
1 5 1 3 4 5 2 5 3 3 8 6
输出:2
解释:共有 6 位扣友,在 12 道题目中选择题目,需要选择 6 题。
3位选择完成知识点类型为 3 的题目,3位选择完成知识点类型为 5 的题目,因此至少包含 2 种知识点类型。
输入说明
输入两行:
第一行为一个整数n代表数组questions的长度,n=2*N,N为扣友的数量。
第二行输入n个整数代表数组questions的元素。
提示:
2 <= n <= 10^5
1 <= questions[i] <= 1000
输出说明
输出一个整数表示结果。
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int min_knowledge_types(int n, const vector<int>& questions)
{
unordered_map<int, int> knowledge_count;
// 统计每种知识点类型的出现次数
for (int q : questions)
{
knowledge_count[q]++;
}
// 将知识点类型的频次放入一个向量
vector<int> counts;
for (const auto& kv : knowledge_count)
{
counts.push_back(kv.second);
}
// 从大到小排序
sort(counts.rbegin(), counts.rend());
int total_questions = 0;
int knowledge_types = 0;
// 选择题目,直到选择了 N 道题目
for (int count : counts)
{
total_questions += count;
knowledge_types++;
if (total_questions >= n / 2)
{
break;
}
}
return knowledge_types;
}
int main()
{
int n;
cin >> n;
vector<int> questions(n);
for (int i = 0; i < n; ++i)
{
cin >> questions[i];
}
cout << min_knowledge_types(n, questions) << endl;
return 0;
}