2021-08-15

美团笔试题(后端)

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;
} 


  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值