携程后端笔试题解 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; }#笔试##笔试复盘##携程笔试#