携程后端笔试题解 2023.3.7 附源码

T1 100/100

遇到不连续的更新一下计数器,否则计数器自增就可以

#include <bits/stdc++.h>
#define int long long
#define re(i,a,b) for(int i=a;i<=b;++i)
#define fo(i,a,b) for(int i=a;i<b;++i)
using namespace std;

int n,a[100005];

signed main() {
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;re(i,1,n) cin>>a[i];
	int ans=1,tmp=1;
	re(i,2,n) {
		if(abs(a[i]-a[i-1])>1) {
			ans=max(ans,tmp);
			tmp=1;
		} else {
			++tmp;
		}
	}
	cout<<max(ans,tmp);
	return 0;
}

T2 100/100

用链表维护字符的插入,插入次数很少,复杂度不高

#include <bits/stdc++.h>
#define int long long
#define re(i,a,b) for(int i=a;i<=b;++i)
#define fo(i,a,b) for(int i=a;i<b;++i)
using namespace std;

int n,q,l,r;
string s;

struct node{
	char c;
	node* nxt;
	node(char C):c(C),nxt(nullptr){}
};

signed main() {
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>q;
	cin>>s;
	auto head=new node(s[0]);
	auto p=head;
	fo(i,1,s.length()) {
		auto tmp=new node(s[i]);
		p->nxt=tmp;
		p=p->nxt;
	}
	while(q--) {
		cin>>l>>r;
		int cnt=1;
		auto p=head;
		while(p!=nullptr) {
			if(cnt>=l&&cnt<=r) {
				auto tmp=new node(p->c);
				tmp->nxt=p->nxt;
				p->nxt=tmp;
				p=p->nxt;
			}
			p=p->nxt;
			++cnt;
		}
	}
	while(head!=nullptr) {
		cout<<head->c;
		head=head->nxt;
	}
	return 0;
}

T1 75/100

二分最短时间,判断一元二次方程有没有解即可,但是我可能精度上出了点问题,后来懒得调了

#include <bits/stdc++.h>
#define int long long
#define re(i,a,b) for(int i=a;i<=b;++i)
#define fo(i,a,b) for(int i=a;i<b;++i)
using namespace std;

double v,x,y;

bool ok(double m) {
	return (v-m*x)*(v-m*x)>4*x*(y-v*m)
		||fabs((v-m*x)*(v-m*x)-4*x*(y-v*m))<1e-8;
}

signed main() {
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>v>>x>>y;
	if(fabs(x)<1e-8) {
		cout<<y/v;
		return 0;
	}
	double l=0,r=1e18;
	while(1) {
		if(fabs(l-r)<1e-8) break;
		double m=(l+r)/2;
		if(ok(m)) r=m;
		else l=m;
	}
	cout<<fixed<<setprecision(5)<<min(r,y/v);
	return 0;
}

T4 100/100

dp,每个物品有两种状态,原价买或者半价买,注意半价买的话状态必须从i-2那边转移过来

#include <bits/stdc++.h>
#define int long long
#define re(i,a,b) for(int i=a;i<=b;++i)
#define fo(i,a,b) for(int i=a;i<b;++i)
using namespace std;

int n,x;
int a[1005],b[1005],dp[1005][1005];

signed main() {
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>x;
	re(i,1,n) cin>>a[i];re(i,1,n) cin>>b[i];
	int ans=0;
	re(i,1,n) {
		re(j,0,x) {
			dp[i][j]=max(dp[i][j],dp[i-1][j]);
			if(j>=a[i])
				dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+b[i]);
			if(i>=2&&j>=a[i-1]+a[i]/2)
				dp[i][j]=max(dp[i][j],dp[i-2][j-a[i-1]-a[i]/2]+b[i-1]+b[i]);
			ans=max(ans,dp[i][j]);
		}
	}
	cout<<ans;
	return 0;
}

#笔试##笔试复盘##携程笔试#
全部评论
供参考:75%可能是因为没考虑极值点为负数的情况
点赞
送花
回复
分享
发布于 2023-03-17 15:47 浙江
大佬全过了吗
点赞
送花
回复
分享
发布于 2023-03-19 21:48 江西
秋招专场
校招火热招聘中
官网直投
感谢大佬,学习一下
点赞
送花
回复
分享
发布于 2023-03-19 22:18 山东

相关推荐

收到了北京经纬恒润AE产品测试部门的offer,有了解的友友吗?工作内容怎么样?加班真的很严重吗?值得去吗?
La_place:有人说的人在那边,就是正常互联网作息吧,一天十个小时出头,双休这样。加班有,但是可能也不算严重?
点赞 评论 收藏
转发
5 12 评论
分享
牛客网
牛客企业服务