目录
题目
作者: 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
输出说明 :
输出一个整数表示结果。
输入范例
6
1 2 3 4 5 1输出范例
2
题目分析
下标与数值反向运用,原来都是序号代表下标,然后数组内部存储数值,
这里是下标代表数值,数组内部存储个数。
解答
代码
#include "bits/stdc++.h"
using namespace std;
#define MVnum 100000
#include "bits/stdc++.h"
using namespace std;
#define ll long long
int arr[1000]={0};
bool cmp(ll a,ll b){
return a>b;
}
int main(){
int n,m,cot=0;
cin>>n;
for(int i=0;i<n;i++){
int k;
cin>>k;
arr[k]++;
}
sort(arr,arr+1000, cmp);
m=n/2;
for(int i=0;m>0;i<1000){
cot++;
m-=arr[i];
i++;
}
cout<<cot;
return 0;
}
代码详解与难点分析(可无)
这道题我一开始想的是set存储自己创建的结构体数组,每一个结构体存储着这个数以及他出现的次数,但是后来借鉴了bwl同学的代码。
for(int i=0;i<n;i++){
int k;
cin>>k;
arr[k]++;
}
这里是下标代表数值,数组内部存储个数
sort(arr,arr+1000, cmp);
m=n/2;
for(int i=0;m>0;i<1000){
cot++;
m-=arr[i];
i++;
}
cout<<cot;
分析
算法的性能分析
整体上只有sort是最大的时间复杂度(除却输入函数),后续的循环如下
sort(arr,arr+1000, cmp);
m=n/2;
for(int i=0;m>0;i<1000){
cot++;
m-=arr[i];
i++;
}
cout<<cot;
时间复杂度实际上只有O(n)