美团笔试题(后端)
2021年8月15日 美团笔试题
第一题:小美的序列查询
描述:
判断给定的数字能否排列成一个1-n的顺序
输入:
输入t表示案例数
输入n表示n个数。
然后输入一个序列。
思路:
记录不重复的数字即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int t,n;
int main(){
cin>>t;
while(t--){
cin>>n;
set<int> s;
for(int i=0;i<n;i++){
int x;
cin>>x;
s.insert(x);
if(x>n){
s.clear();
}
}
if(s.size()==n){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
}
二.小美的回文串构建(有点小问题)
描述:
给定一个字符串,判断在末尾加多少个字符能使其成为一个回文串
输入:
一个字符串
输出:
需要加入的字符数
思路:
双指针中心扩散。分奇偶
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
string s;
int main(){
cin>>s;
int len=s.size();
int flag=0;
int pos=0;
for(int i=(len+1)/2;i<len;i++){
int l=i-1,r=i,jl=i-2,jr=i;
while(r<len&&s[l]==s[r]){
l--;
r++;
}
while(jr<len&&s[jl]==s[jr]){
jl--;
jr++;
}
if(r==len){
if(pos<i){
pos=i;
flag=-1;
}
}
if(jr==len){
if(pos<i-1){
pos=i-1;
flag=1;
}
}
if(flag!=0)break;
}
if(flag==1){
cout<<pos*2+1-len<<endl;
}else if(flag==-1){
cout<<(pos)*2-len<<endl;
}else{
cout<<len-1<<endl;
}
}
第四题:小美的最快到达时间
描述:
太长了。
思路:
求步行的最短路与打车的最短路,最后贪心判断
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e2+10;
int n,m,x,y,a[maxn][maxn],b[maxn][maxn],t[maxn],min_=1e9,dis[maxn],dis2[maxn];
vector<int> vv[maxn];
void bfs1(){
queue<int> q;
q.push(x);
while(!q.empty()){
int temp=q.front();
q.pop();
int len=vv[temp].size();
for(int i=0;i<len;i++){
int tt=vv[temp][i];
if(dis[tt]>(dis[temp]+b[temp][tt])){
dis[tt]=dis[temp]+b[temp][tt];
q.push(tt);
}
}
}
}
void bfs2(){
queue<int> q;
q.push(y);
while(!q.empty()){
int temp=q.front();
q.pop();
int len=vv[temp].size();
for(int i=0;i<len;i++){
int tt=vv[temp][i];
if(dis2[tt]>(dis2[temp]+a[temp][tt])){
dis2[tt]=dis2[temp]+a[temp][tt];
q.push(tt);
}
}
}
}
int main(){
cin>>n>>m>>x>>y;
for(int i=1;i<=m;i++){
int X,Y;
cin>>X>>Y;
vv[X].push_back(Y);
vv[Y].push_back(X);
cin>>a[X][Y]>>b[X][Y];
a[Y][X]=a[X][Y];
b[Y][X]=b[X][Y];
}
for(int i=1;i<=n;i++){
dis[i]=1e9;
dis2[i]=1e9;
cin>>t[i];
}
dis[x]=0;
dis2[y]=0;
bfs1();
bfs2();
min_=min(min_,dis[y]);
for(int i=1;i<=n;i++){
dis[i]=max(dis[i],t[i]);
min_=min(dis[i]+dis2[i],min_);
}
cout<<min_<<endl;
}
第五题小美的水洼地冒险
描述:
类似于青蛙跳
思路:
简单dp即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,p,a[maxn],dp[maxn];
string s;
int main(){
cin>>n>>p;
cin>>s;
s="x"+s;
for(int i=1;i<=p;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++)dp[i]=1e9;
dp[1]=0;
for(int i=1;i<=n;i++){
if(s[i]!='o')continue;
for(int j=1;j<=p;j++){
if(s[j+i]=='o')dp[i+j]=min(dp[i+j],dp[i]+a[j]);
}
}
cout<<dp[n]<<endl;
}