8.19小红书笔试AK

1、模拟,对输入的单词进行计数&判断是否可以记忆即可。

#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<unordered_set>
using namespace std;
int main(){
    int n;
    cin>>n;
    int cnt=1;
    unordered_map<string, int>mp;
    unordered_set<string>se;
    for(int i=0; i<n; i++){
        string s;
        cin>>s;
        mp[s]++;
        //  背诵次数大于等于cnt时可以记忆,并更新下个单词需要记忆的次数。
        if(mp[s]>=cnt&&!se.count(s)){
            se.insert(s);
            cnt++;
        }
    }
    cout<<se.size()<<endl;
    return 0;
}

2、字符串替换,有2个坑,不加传递关系只能a18%:既然n和u可以相互替换,m可以拆分成两个n,那么m也可以拆分成两个u,即替换关系是可以传递的;其次,根据传递关系,b,d,p,q两两之间也是等价的。

#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<unordered_set>
using namespace std;
unordered_map<string, unordered_map<string, bool> >mp;
bool check(string s){
    int l=0, r=s.length()-1;
    while(l<r){
        if(s[l]!=s[r]){
            string ll = "";
            ll+=s[l];
            string rr = "";
            rr+=s[r];
            if(mp[ll][rr]||mp[rr][ll]){
                l++;
                r--;
                continue;
            }
            if(ll=="w"||ll=="m"){
                if(ll=="w"&&s[r]=='v'){
                    s[l]='v'; // w拆分成两个v,l指针不需要移动,并修改为v
                    r--;
                    continue;
                }
                if(ll=="m"&&s[r]=='n'){
                    s[l]='n';
                    r--;
                    continue;
                }
                if(ll=="m"&&s[r]=='u'){
                    s[l]='u';
                    r--;
                    continue;
                }
            }
            if(rr=="w"||rr=="m"){
                if(rr=="w"&&s[l]=='v'){
                    l++;
                    s[r]='v';
                    continue;
                }
                if(rr=="m"&&s[l]=='n'){
                    l++;
                    s[r]='n';
                    continue;
                }
                if(rr=="m"&&s[l]=='u'){
                    l++;
                    s[r]='u';
                    continue;
                }
            }
            return false;
        }
        else{
            l++;
            r--;
        }
    }
    return true;
}
int main(){
    mp["w"]["vv"]=1;
    mp["m"]["nn"]=1;
    
    mp["b"]["d"]=1;
    mp["b"]["q"]=1;
    mp["b"]["p"]=1;
    
    mp["d"]["p"]=1;
    mp["d"]["q"]=1;

    mp["p"]["q"]=1;
    
    mp["n"]["u"]=1;
    mp["uu"]["m"]=1;
    int n;
    cin>>n;
    for(int i=0; i<n; i++){
        string s;
        cin>>s;
        bool ok = check(s);
        if(ok)puts("YES");
        else puts("NO");
    }
    
    return 0;
}

3、直接dfs搜索即可,首先,注意cost>k或者超过3个城市就return,其次,结果需要用long long存储。

#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<unordered_set>
using namespace std;
const int N=1e5+5;
int n, m, k;
int a[N], h[N], vis[N];
struct Edge{
    int to;
    int w;
    Edge(){
    }
    Edge(int _to, int _w){
        to=_to;
        w=_w;
    }
};
vector<Edge>edges[N];
long long ans;
void dfs(int cur, long long value, int cost, int depth){
    if(cost>k||depth>3)return;
    ans=max(ans, value);
    for(int i=0; i<edges[cur].size(); i++){
        Edge edge = edges[cur][i];
        if(vis[edge.to])continue;
        vis[edge.to]=1;
        dfs(edge.to, value+a[edge.to], cost+h[edge.to]+edge.w,depth+1);
        vis[edge.to]=0;
    }
}
int main(){
    
    cin>>n>>m>>k;
    for(int i=1; i<=n; i++){
        cin>>a[i];
    } 
    for(int i=1; i<=n; i++){
        cin>>h[i];
    }  
    for(int i=0; i<m; i++){
        int u,v,w;
        cin>>u>>v>>w;
        edges[u].push_back(Edge(v,w));
        edges[v].push_back(Edge(u,w));
    }


    for(int i=1; i<=n; i++){
        vis[i]=1;
        dfs(i,a[i],h[i],1);
        vis[i]=0;
    }
    cout<<ans<<endl;
    return 0;
}

全部评论
厉害
点赞 回复 分享
发布于 2023-08-19 18:05 浙江
第二题这样也可以
点赞 回复 分享
发布于 2023-08-19 18:12 四川
牛!
点赞 回复 分享
发布于 2023-08-19 18:12 四川
m
点赞 回复 分享
发布于 2023-08-19 18:14 北京
Ac两题,一题a了9%
点赞 回复 分享
发布于 2023-08-19 22:42 上海
m
点赞 回复 分享
发布于 2023-08-20 12:23 江苏
请教一下,这里第三题 dfs 的复杂度是 n^3 吧(点的度数是 O(n))?n 最大 1e5,按理来说会超时吧
点赞 回复 分享
发布于 2023-08-20 23:42 北京
m
点赞 回复 分享
发布于 2023-08-22 23:14 湖北
这个解法第三题没超时?
点赞 回复 分享
发布于 2023-08-23 11:05 陕西

相关推荐

11-08 17:36
诺瓦科技_HR
点赞 评论 收藏
分享
Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
15 41 评论
分享
牛客网
牛客企业服务