小红书笔试AK7.23

第一题签到

第二题,题目讲的有点模糊,很容易让人读不懂题,大致就是给你多个不重叠的区间,然后你需要选择一个长度为k的连续区间,使其中被标记的空间数量最大。解法:二分搜索

第三题,题目意思大致就是给定一个数组与一个数字val,你可以任意的讲数组中的一个值替换成val,求最大连续子数组和。解法:dp,存储数组中每个下标的状态,0代表到这个位置还没有替换,1代表已经替换过一次,从而推导状态转移方程。

题目挺有意思的,整体难度不大,就是第二题题目描述不是很清楚。

//第一题
#include <iostream>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
int main(){
    ll n,k;
    cin>>n>>k;
    ll ans=n*(n+1)/2;
    ans=ans*k;
    cout<<ans<<endl;
}

//第三题
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
const int N = 2e5+5;
ll k[N];
ll dp[N][2];
int main(){
    int T;
    cin>>T;
    while(T--){
        memset(dp,0,sizeof(dp));
        ll n,val;
        ll ans=-10000000009;
        cin>>n>>val;
        for(int i=0;i<n;i++){
            cin>>k[i];
        }
        dp[0][0]=k[0];
        dp[0][1]=val;
        ans=max(ans,dp[0][1]);
        ans=max(ans,dp[0][0]);

        for(int i=1;i<n;i++){
            dp[i][1]=max(max(dp[i-1][1]+k[i],k[i]),max(dp[i-1][0]+val,val));
            dp[i][0]=max(dp[i-1][0]+k[i],k[i]);
            ans=max(ans,dp[i][1]);
            ans=max(ans,dp[i][0]);
        }
        cout<<ans<<endl;
    }
}


//第二题
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 1e5+5;
struct kk{
    ll bepos;
    ll enpos;
    ll val;
    ll sum;
}Mess[N];
bool cmp(kk a,kk b){
    return a.bepos<b.bepos;
}
ll erfen(ll low,ll high,ll aim){
    ll mid=(low+high)/2;
    while(low<high){
        ll x=Mess[mid].enpos;
        if(x>=aim){
            high=mid;
        }else{
            low=mid+1;
        }
        mid=(low+high)/2;
    }
    return high;
}
int main(){
    ll n,m,k;
    cin>>n>>m>>k;
    Mess[0].sum=0;
    for(int i=1;i<=m;i++){
        cin>>Mess[i].bepos>>Mess[i].enpos;
        Mess[i].val=Mess[i].enpos-Mess[i].bepos;
        Mess[i].sum=Mess[i-1].sum+Mess[i].val;
    }
    Mess[m+1].bepos=n+1;
    Mess[m+1].enpos=n+1;
    Mess[m+1].sum=Mess[m].sum;
    sort(Mess+1,Mess+1+m,cmp);
    // for(int i=1;i<=m+1;i++){
    //     cout<<Mess[i].bepos<<' '<<Mess[i].enpos<<endl;
    // }
    ll ans=0;
    for(int i=1;i<=m;i++){
        ll vals=0;
        int be=Mess[i].bepos;
        int en=Mess[i].bepos+k;
        // cout<<be<<' '<<en<<"  message"<<endl;
        if(en>=n){
            vals=Mess[m].sum-Mess[i-1].sum;
        }else{
            int nextindex=erfen(i,m+1,en);
            vals=Mess[nextindex-1].sum-Mess[i-1].sum;
            if(en>Mess[nextindex].bepos){
                vals+=en-Mess[nextindex].bepos;
            }
            // cout<<"index: "<<nextindex<<endl;
            // cout<<nextindex<<endl;
        }
        ans=max(ans,vals);

    }
    cout<<ans<<endl;
}
全部评论
没啥说的,我承认跟你智商有差距,另外 tm 的笔试题出的这么恶心这破公司我都不想去了,感觉出题的不会说中国话
3 回复 分享
发布于 2023-07-23 21:31 北京
第三题我的思路跟你一样每调出来😭
1 回复 分享
发布于 2023-07-23 21:11 北京
第一题代码啥思路啊
1 回复 分享
发布于 2023-07-23 21:18 浙江
需要的友友可以看看我首页米哈游有大量岗位,实习和正式,可以找我了解。
1 回复 分享
发布于 2023-07-23 23:16 上海
大佬全ac了?
点赞 回复 分享
发布于 2023-07-23 21:07 陕西
第二题真的是读不懂题目😂😂
点赞 回复 分享
发布于 2023-07-23 21:08 上海
阿这,大佬接受我的膝盖😭
点赞 回复 分享
发布于 2023-07-23 21:09 北京
膜拜大佬
点赞 回复 分享
发布于 2023-07-23 21:17 黑龙江
第二题差分加滑动窗口不可以吗?或者只用滑动窗口。我只过了36%
点赞 回复 分享
发布于 2023-07-23 21:29 浙江
请问一下,第二题是什么思路
点赞 回复 分享
发布于 2023-07-24 10:41 安徽

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
18 43 评论
分享
牛客网
牛客企业服务