2024.08.24阿里灵犀互娱

1. 减一

给出一组数,求出最长的子串。使得这个子串中的数最大值和最小值的差值最大为1。 
如1 5 4 1 2 4 2 5 5。最长子串为5 4 4 5 5,长度为5

红黑树计数即可

int main(int argc, char *argv[]) {
    int n;
    cin>>n;
    vector<int> nums(n);
    map<int,int> m;
    for(int i=0;i<n;i++){
        cin>>nums[i];
        m[nums[i]]++;
    }
    int res = 0;
    for(auto &[key,val]:m){
        if(m.count(key+1)) res = max(res,m[key]+m[key+1]);
        res = max(res,m[key]);
    }
    cout<<res;
    return 0;
}

2. 小杰的灵犀之旅

纯简单题
int main() {
    int T;
    cin >> T;

    for (int i = 0; i < T; i++) {
        int n, m;
        cin >> n >> m;
        
        long long res = 0;
        for (int j = 0; j < n; j++) {
            int l, r;
            cin >> l >> r;
            res += r - l + 1;
            res %= 998244353;
        }
        
        cout << res << endl;
    }

    return 0;
}

3. 消息队列

王小二正在参与一款游戏中的聊天工具的开发,他负责其中的会话列表部分。 会话列表显示为一个从上到下的多行控件,其中每一行表示一个会话,每一个会话都可以以一个唯一正数id表示。 
当用户在一个会话中发送或者接收信息时,如果该会话已经在会话列表中,则会从原来的位置移到列表最上方;如果没有在会话列表中,则在会话列表最上方插入该会话。 
王小二现在要进行测试,他会先把会话列表清空,等待接收信息。当接收完大量来自不同会话的信息后,就输出当前的会话列表,以检查其中是否有bug。

简化的LRU,用栈反向输出即可
int main(int argc, char *argv[]) {
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        //按栈存数即可,已经出过的跳过
        stack<int> st;
        unordered_set<int> s;
        int num;
        for(int i=0;i<n;i++){
            cin>>num;
            st.push(num);
        }
        while(!st.empty()){
            if(st.size()!=n) cout<<" ";//输出空格
            int cur = st.top(); st.pop();
            if(s.find(cur)==s.end()) cout<<cur;//没有输出过
            s.insert(cur);//标识该id已经出过
        }
        if(t>0) cout<<endl;
    }
    return 0;
}

4. 交点数

假设平面上有n条直线,且不存在三条或以上直线共点的情况,
求这n条直线可能存在多少种不同交点数。例n=2,则可能的交点数量为0(平行)或者1(不平行)

动态规划,dp[i][j]表示i条线形成j个点的可行性,然后枚举i条线里面的平行线和非平行线进行转移

int main() {
    string line;
    while(getline(cin,line)){
        int n = stoi(line);
        //dp[i][j]表示i条线形成j个交叉点的可行性
        vector<vector<bool>> dp(n + 1, vector<bool>(n * (n - 1) / 2 + 1, 0));
        for(int i=0;i<=n;i++)
            dp[i][0] = 1;//所有点都可以形成零个交叉点
        for(int i=2;i<=n;i++){//遍历所有数量的线
            for(int j=0;j<i;j++){//平行的线,可以给另外的线,加上对应数量的交叉点
                for(int k=0;k<=i*(i-1)/2;k++){//所有状态向后转移
                    dp[i][(i-j)*j+k] = dp[i][(i-j)*j+k]|dp[i-j][k];//不平行的线形成k个交叉点,加上平行线,就可以新增对应交叉点
                }
            }
        }
        vector<int> res;
        for(int i=0;i<=n*(n-1)/2;i++)
            if(dp[n][i])  res.push_back(i);

        for(int i=0;i<res.size();i++){
            if(i!=0) cout<<" ";
            cout<<res[i];
        }
        cout<<endl;
    }
    return 0;
}

5. 敏感词过滤

敏感词过滤一直是游戏里面最恼人的事情。恶意玩家总是想办法通过一定的修改来达到既能让系统检测不到,又让其他人看出来他发的内容。 
现在,假设这些恶意玩家有这样两种操作:把字符串a的某些大写字符变成小写字符把字符串a的某些大写字符删掉
现给出两个字符串,判断能否通过以上两种操作从A字符串变成B字符串。

类似编辑距离

int dis(string&a,string&b){
    int m = a.size(); int n = b.size();
    //dp[i][j]表示将a中前i个字符变成b中前j个字符的最小操作次数
    //dp[i][j] = dp[i-1][j-1]+1 如果a[i] 为b[j]的大写
    //dp[i][j] = dp[i-1][j-1]  如果a[i]与b[j]相同
    //dp[i][j] = dp[i-1][j]+1  如果a[i]为大写
    vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX/2));
    dp[0][0] = 0;
    for(int i=1;i<=m;i++){
        if(a[i-1]>='A'&&a[i-1]<='Z') dp[i][0] = min(dp[i][0],dp[i-1][0]+1);
        for(int j=1;j<=n;j++){
            if(a[i-1]>='A'&&a[i-1]<='Z'){//a为大写
                dp[i][j] = min(dp[i][j],dp[i-1][j]+1);
                if(a[i-1]-b[j-1]=='A'-'a')  dp[i][j] = min(dp[i][j],dp[i-1][j-1]+1);
            }
            if(a[i-1]==b[j-1]) dp[i][j] = min(dp[i][j],dp[i-1][j-1]);
        }
    }
    return dp[m][n];
}
posted @   失控D大白兔  阅读(9)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示