小红书C++开发笔试8.19AK
第一题背单词
第一题用一个哈希表存每个单词对应的次数,维护一个count变量记录当前所需次数,只要当前单词次数大于count,count自增,然后用set将该单词记录避免重复统计,最后输出count
#include<iostream> #include<string> #include<vector> #include<unordered_map> #include<unordered_set> using namespace std; int main(){ int n; cin>>n; string s; int count = 1; unordered_map<string, int> map; unordered_set<string> isRem; for(int i=0;i<n;i++){ cin>>s; map[s]++; if(map[s]>=count){ if(isRem.count(s)==0){ isRem.insert(s); count++; } } } cout<<count-1<<endl; }
第二题回文串
这题有点脑筋急转弯,其实只要将m和w先拆开,然后左右指针判断即可
#include<iostream> #include<string> #include<vector> #include<unordered_map> #include<unordered_set> using namespace std; void check(string s){ int l = 0, r = s.size() - 1; while(l < r){ if(s[l]==s[r]){ l++;r--; } else if(s[l]=='b'||s[l]=='p'||s[l]=='q'||s[l]=='d'){ if(s[r]=='b'||s[r]=='p'||s[r]=='q'||s[r]=='d'){ l++;r--; } else{ cout<<"NO"<<endl; return; } } else if(s[l]=='n'||s[l]=='u'){ if(s[r]=='n'||s[r]=='u'){ l++;r--; } else{ cout<<"NO"<<endl; return; } } else{ cout<<"NO"<<endl; return; } } cout<<"YES"<<endl; } int main(){ int n; cin>>n; string s; for(int i=0;i<n;i++){ cin>>s; string str = ""; for(char ch:s){ if(ch=='w'){ str += "vv"; } else if(ch=='m'){ str += "nn"; } else str.push_back(ch); } check(str); } }
第三题旅游景点
只能经过三个城市,暴力dfs即可,有点坑的是不能用邻接矩阵表示城市间所需时间,这样好像会爆内存,但是赛码网不会提醒,得去提交记录里面看内存记录
#include<iostream> #include<string> #include<vector> #include<unordered_map> #include<unordered_set> using namespace std; int main(){ int n,m; long long k; int a,b,c; cin>>n>>m>>k; vector<int>sites(n+1); for(int i=1;i<=n;i++) cin>>sites[i]; vector<int>times(n+1); for(int i=1;i<=n;i++) cin>>times[i]; unordered_map<int,vector<pair<int,int>>> roads; for(int i=0;i<m;i++){ cin>>a>>b>>c; roads[a].push_back({b,c}); roads[b].push_back({a,c}); } long long maxvalue = 0; for(int i=1;i<=n;i++){ if(times[i]>k) continue; maxvalue = max(maxvalue, (long long)sites[i]); // 第一步 从i出发 vector<pair<int,int>> next = roads[i]; for(pair<int,int> p:next){ long long time = times[i]; long long value = sites[i]; int j = p.first; int road = p.second; if(i!=j){ time += (times[j] + road); if(time>k) continue; value += sites[j]; maxvalue = max(maxvalue, value); /// 第二步 从j出发 vector<pair<int,int>> next1 = roads[j]; for(pair<int,int> q:next1){ long long time2 = time; long long value2 = value; int x = q.first; int road1 = q.second; if(x!=j&&x!=i){ time2 += (times[x] + road1); if(time2>k) continue; value2 += sites[x]; maxvalue = max(maxvalue, value2); } } } } } cout<<maxvalue<<endl; }
感觉比小红书提前批的题简单多了
#小红书#