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;
}
腾讯公司福利 1155人发布