8.26美团笔试五道题题解
T1
二分答案
经典二分答案题,二分答案天数mid 然后根据x和y计算最终成长值是否>=z
bool check(int mid){
return 1ll*mid*x+1ll*mid/3*y>=z;
}
void solve(int u) {
cin>>x>>y>>z;
int l=0,r=1e9;
while(l<r){
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
T2
纯模拟,注意上取整即可
void solve(int u) {
cin>>n>>m;
for(int i=1;i<=n;i++){
int k,c;
cin>>k>>c;
int cost=(c+k-1)/k; //上取整
for(int j=1;j<k;j++){
int p;
cin>>p;
res[p]+=cost;
}
}
for(int i=1;i<=m;i++)cout<<res[i]<<" ";
}
T3
贪心:维护一个大根堆,每次取出最大值和次大值进行操作(记得开long long)
void solve(int u) {
cin>>n>>k;
priority_queue<long long>heap; //大根堆
for(int i=0;i<n;i++){
int x;
cin>>x;
heap.push(x);
}
while(k--){
auto x=heap.top();heap.pop();
auto y=heap.top();heap.pop();
heap.push((x*y)%mod);heap.push(1);
}
ll res=0;
while(heap.size()){
res=(res+heap.top())%mod;
heap.pop();
}
cout<<res<<endl;
}
T4
贪心:田忌赛马的思想,让a的最大值与b的最小值匹配,a的次大值与b的次小值匹配...虽然说b数组是固定,但其实是可以排序之后匹配的,这样代码会好写一写
void solve(int u) {
cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)cin>>b[i];
sort(b,b+m);
sort(a,a+n);
int res=0,minnum=1e9;
for(int i=0;i<n;i++){
int x=a[i]+b[n-i-1];
if(x<1||x>m){
puts("No");
return;
}
}
puts("Yes");
}
T5
设s[i]为1~i的前缀和大小
如果(i,j]区间满足平均值为k 则有s[j]-s[i]=(j-i)*k
交换一下式子即有s[j]-j*k=s[i]-i*k
因此使用哈希表维护s[i]-i*k即可
int T, a[N],w[N],k,n;
int res=-1;
void solve(int u) {
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>w[i];
map<long long,int>mp;
mp[0]=0;
long long sum=0;
for(int i=1;i<=n;i++){
sum+=w[i];
if(mp.count(sum-k*i)){
res=max(res,i-mp[sum-k*i]); //更新最大长度
}
else{
mp[sum-k*i]=i;
}
}
cout<<res<<endl;
}
#后端开发##秋招##美团##互联网##笔试#互联网笔试真题题解 文章被收录于专栏
收录近两年互联网公司笔试真题解析,并提供Java,Python,C++三种语言版本的代码
查看20道真题和解析