L2-019 悄悄关注

这道题考点就是判断重复与字母升序

  1. 判断重复使用set的大小变化来判断

  1. 判断升序直接插入到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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值