这道题考点就是判断重复与字母升序
判断重复使用set的大小变化来判断
判断升序直接插入到set中来得到结果。
如果直接使用顺序查找的方法来做,O(nm)=5000*10000=5e7似乎超时了。
n^2的时间复杂度需要n小于1e4,这里明显m=1e4。再加上其他的几个循环,就撑不住了。
https://blog.csdn.net/m0_59815387/article/details/124506833
std::set通常实现为红黑色二进制搜索树。 由于树保持平衡,因此在此数据结构上插入会带来O(log(n))复杂度的最坏情况。
set一遍排序的是可接受的。时间复杂度就变为了O(nlog(n))。
总之,如果要使用查重的操作的话,红黑树的方法似乎是比较好的了。
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int const N=5e3+10;
int n,m;
string a[N];
int main(){
vector<string> v1;
vector<int> v2;
set<string> s1;//s1是关注列表,s2是非关注列表
cin>>n;
for(int i=0;i<n;i++){
string t;
cin>>t;
s1.insert(t);
}
cin>>m;
double sum=0;
while(m--){
string n;
int d;
cin>>n>>d;
sum+=d;
v1.push_back(n);
v2.push_back(d);
}
sum/=v1.size();
set<string> st;
int stc=s1.size();
for(int i=0;i<v1.size();i++){
bool f=false;//如果不在关注列表,就为true
s1.insert(v1[i]);//插入到关注列表中
if(stc<s1.size())//如果变大了,说明新增了关注人员
f=true;
stc=s1.size();//同步上一次插入后的关注列表大小
if(v2[i]>sum&&f)
st.insert(v1[i]);
}
if(st.size()){
for(auto it=st.begin();it!=st.end();it++)
cout<<*it<<endl;
}
else puts("Bing Mei You");
}