“可达鸭杯“山东大学程序设计精英挑战赛 - 预赛

本文介绍了“可达鸭杯“山东大学程序设计精英挑战赛的预赛题目,包括A到K共11个题目。题目涉及算法和数据结构的应用,如字符串处理、地铁线路优化、游戏策略、五子棋策略、商品定价、石子游戏、字符串相似度计算、比赛题目难度评估、随机选取区间概率分析以及字符序列变换等。

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

A题目描述

你说得对,但是《山东大学》是由国家自主创办的一所综合性大学。学校位于中国山东省,拥有悠久的历史和卓越的学术声誉。在这里,学生们可以获得广泛的学科教育和丰富的学术资源。你将扮演一位名为「学子」的角色,在这个知识的海洋中追求学术成就,与各具特色、才华横溢的同学们相遇,共同探索学术领域的边界,为社会的发展做出贡献。
你的学习成绩很一般。我现在每天在山东大学学习,都能获取丰富的知识和学术资源。我每学期上学都能获得30学分,每年差不多60学分的收入,也就是现实生活中每个月7学分的学习水平,换算过来最少也两门核心课。虽然我只有20岁,但我的学术水平超越了绝大多数同龄人————包括你在内。这是山东大学赋予我的骄傲的资本。毫不夸张地说,山东大学是中国高等教育领域中规模最大、最具影响力的一所学府,也是国内外学术研究的重要基地。即便在度过了漫长的学业之路后,仍然有许多未知的领域等待我们去探索,错过的学术机会和未曾涉足的学科领域。尽管学习过程中的困难与我们之前所面临的挑战有所不同,但山东大学提供了精心设计的学科课程和深入研究的机会,将我们的学术能力提升到一个新的高度。就像几十年前的《北京大学》一样,它也是一所能够推动教育事业向前发展的优秀学府。
这位同学,我再强调一遍!山东大学很厉害!本科上山东大学,让你考研、直博、出国机会倍增,山东大学写在简历上,远比其他乱七八糟的信息更硬核!多为读山东大学花心思,别舍不得精力物力,往这方面投入比吃喝拉撒回报率高无数倍!如果你还不行动起来,那我只能通过校园网找到你给你加学分了

Prof. Wang 是一位计算机科学家,他对大语言模型 (Large Language Model, LLM) 理解颇深。以上是著名的大语言模型 chatgpt-3.5 对 Prof. Wang 母校的评价(出题人进行了不改变原意的微调)。如果你并不了解大语言模型,那么恭喜幸运的你,这题不需要对其进行深入的理解。

Prof. Wang 有一个不成器的学生小 Z,小 Z 把 Prof. Wang 的模型改崩了。Prof. Wang 使用他的模型生成了一段 仅由小写英文字母 组成的段落,意外发现里面出现了若干个不想看到的字符——大写的 Z,现在 Prof. Wang 想让你把这些 Z 全部删除,请你输出修改后的字符串是什么样的。

#include<stdio.h>
#include<string.h>
int main()
{
    char s[101];
    scanf("%s",s);
    int m=strlen(s);
    for(int i=0;i<m;i++)
    {
        if(s[i]!='\0'){
        if(s[i]=='Z') continue;
        else printf("%c",s[i]);}
    }
    return 0;
}

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

B题目描述

2023年8月27日,福州地铁4号线正式开通!

吉吉是福州市的一位普通市民。由于吉吉的家附近刚好有一处4号线的地铁站,吉吉可以搭乘4号线更方便地去其他地方游玩(比如去东泰禾打maimai)。

4号线有 nnn 个站点,以某个方向从起点站开始从 111 到 nnn 依次标号。吉吉从他的好朋友(是一位地铁爱好者)Hakuro得知,地铁是所有交通公具中最准时的。地铁会按照规定的单位时间数依次到达每个站点。当然,一条线路上任意两个站点的往返乘车耗时是相等的。如下图所示的时间中,如果吉吉从东街口站上车前往会展中心站,那么他将耗费 35−10=2535 - 10 = 2535−10=25 个单位时间;如果吉吉从城门站上车前往竹屿站,那么他将耗费 27−4=2327 - 4 = 2327−4=23 个单位时间。

 


(可以看到从左到右,城门站、会展中心站、竹屿站和东街口站的显示的时间数依次为4、10、27和35)

趁着4号线的免费试乘活动,吉吉打算只搭乘4号线去其他地铁站的附近游玩。假设吉吉家附近的地铁站的标号为 k (1≤k≤n)k \ (1 \le k \le n)k (1≤k≤n) ,对于第 iii 个地铁站,有一个单位时间值 tit_iti​ 和一个欢乐值 viv_ivi​ ,表示吉吉选择在第 iii 个地铁站附近游玩需要耗费 tit_iti​ 的单位时间,游玩结束后会获得 viv_ivi​ 点欢乐值。当然,如果之前已经在某个地铁站附近游玩后再次选择该地铁站游玩,那么吉吉游玩结束后不会获得该站的欢乐值(谁会在同一个地铁站玩两次啊)。特殊的,由于吉吉对家周围的情况非常熟悉,所以有 tk=0t_k = 0tk​=0 和 vk=0v_k = 0vk​=0 。

由于吉吉身上有因幡天为的四叶草,所以只要吉吉到地铁站就可以马上乘车。当然,由于免费试乘活动的时间有限,吉吉必须在 TTT 个单位时间内从家里出发出门活动,并且最后要回到家里。吉吉想知道,在 TTT 个单位时间内如何安排自己的游玩行程,使得得到的欢乐值总和 VVV 最多?但是吉吉现在在东泰禾和Hakuro拼机,所以他把这个问题交给了聪明的你。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int M = 2e5+5;
ll f1[M],f2[M];

void solve(){   
    int n,T,k;
    cin >> n >> T >> k;
    vector<int> t(n+1),v(n+1),w(n+1);
    for(int i = 1; i <= n; i ++ )cin >> t[i];
    for(int i = 1; i <= n; i ++ )cin >> v[i];
    for(int i = 1; i <= n; i ++ )cin >> w[i];

    ll ans = 0;
    for(int i = 1; i <= k; i ++ ){
        int need = 2*(t[k]-t[i]);
        for(int j = T; j >= v[i]+need; j -- ){
            f1[j] = max(f1[j],f1[j-v[i]]+w[i]);
        }
    }    

    for(int i = n; i >= k; i -- ){
        int need = 2*(t[i]-t[k]);
        for(int j = T; j >= v[i]+need; j -- ){
            f2[j] = max(f2[j],f2[j-v[i]]+w[i]);
        }
    }   

    for(int t1 = 0; t1 <= T; t1 ++ ){
        int t2 = T - t1;
        ans = max(ans,f1[t1]+f2[t2]);
    }
    cout << ans;
}   

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
        solve();
 
    return 0;
}

 

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

C题目描述

小 Z 沉迷于一款游戏。

这款游戏是这样的:小 Z 扮演一个勇者去挑战一个怪兽。小 Z 可以和这个怪兽战斗 nnn 回合,小 Z 的初始攻击力为 111,小 Z 有两个技能,每回合他必须选择一个技能使用,两个技能为:

- 强化: 让自己的攻击力翻倍。
- 攻击: 对怪兽造成伤害值为 自己当前攻击力 的伤害。

这款游戏显然非常无聊,因为怪兽不会攻击小 Z, 但小 Z 沉迷这种多次强化之后一刀 999 的快感。

当小 Z 对怪兽造成的伤害总和不少于 mmm 时,小 Z 就能战胜怪兽 。小 Z 想知道他能否通过合理使用技能在 nnn 回合内战胜怪兽。

#include<stdio.h>
#include<math.h>
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    long long k=pow(2,n-1);
    if(k>=m) printf("Yes");
    else printf("No");
}

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

D题目描述

Prof. Wang 闲暇时喜欢和他的学生小 Z 下五子棋。

五子棋的规则大概是这样:在一张 15×1515\times 1515×15 的棋盘上,先手执黑,后手执白,二人轮流落子。每次可以选择一个还未被占据的格子,落下自己的棋子。若某一时刻,落子后存在五个自己的棋子连成一条连续的线(包含横线、竖线和与主副对角线平行的的斜线),则判定为获胜。(本题中不强制第一手必须天元、不考虑各类禁手)

Prof. Wang 在游戏中总是先手,但作为一名 Professor,他深知传统功夫以点到为止,即便是对待他的弟子小 Z 也是如此。当一个残局已经进行到自己可以一步必杀时,他会绅士地提和。现在 Prof. Wang 给了你一张残局,请你输出他是否可以使用下一步拿下小 Z。

#include<stdio.h>
typedef struct{
    char s[15];
}yp;
yp a[15];
int main()
{
    int T;
    scanf("%d",&T);
    for(int i=0;i<T;i++)
    {
        for(int j=0;j<15;j++)
        {
            scanf("%s",a[j].s);
        }
        for(int j=0;j<15;j++)
        {
            for(int k=0;k<15;k++)
            {
                if(k+4<15){
                    if(a[j].s[k]=='0'&&a[j].s[k+1]=='1'&&a[j].s[k+2]=='1'&&a[j].s[k+3]=='1'&&a[j].s[k+4]=='1'){
                        printf("Yes\n");
                        goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j].s[k+1]=='0'&&a[j].s[k+2]=='1'&&a[j].s[k+3]=='1'&&a[j].s[k+4]=='1'){
                        printf("Yes\n");
                        goto out;
                    }
                     if(a[j].s[k]=='1'&&a[j].s[k+1]=='1'&&a[j].s[k+2]=='0'&&a[j].s[k+3]=='1'&&a[j].s[k+4]=='1'){
                        printf("Yes\n");
                        goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j].s[k+1]=='1'&&a[j].s[k+2]=='1'&&a[j].s[k+3]=='0'&&a[j].s[k+4]=='1'){
                        printf("Yes\n");
                       goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j].s[k+1]=='1'&&a[j].s[k+2]=='1'&&a[j].s[k+3]=='1'&&a[j].s[k+4]=='0'){
                        printf("Yes\n");
                        goto out;
                    }
                }
                if(j+4<15){
                   if(a[j].s[k]=='0'&&a[j+1].s[k]=='1'&&a[j+2].s[k]=='1'&&a[j+3].s[k]=='1'&&a[j+4].s[k]=='1'){
                        printf("Yes\n");
                       goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k]=='0'&&a[j+2].s[k]=='1'&&a[j+3].s[k]=='1'&&a[j+4].s[k]=='1'){
                        printf("Yes\n");
                       goto out;
                    }
                     if(a[j].s[k]=='1'&&a[j+1].s[k]=='1'&&a[j+2].s[k]=='0'&&a[j+3].s[k]=='1'&&a[j+4].s[k]=='1'){
                        printf("Yes\n");
                        goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k]=='1'&&a[j+2].s[k]=='1'&&a[j+3].s[k]=='0'&&a[j+4].s[k]=='1'){
                        printf("Yes\n");
                       goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k]=='1'&&a[j+2].s[k]=='1'&&a[j+3].s[k]=='1'&&a[j+4].s[k]=='0'){
                        printf("Yes\n");
                        goto out;
                    }
                }
                if(j+4<15&&k+4<15){
                    if(a[j].s[k]=='0'&&a[j+1].s[k+1]=='1'&&a[j+2].s[k+2]=='1'&&a[j+3].s[k+3]=='1'&&a[j+4].s[k+4]=='1'){
                        printf("Yes\n");
                       goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k+1]=='0'&&a[j+2].s[k+2]=='1'&&a[j+3].s[k+3]=='1'&&a[j+4].s[k+4]=='1'){
                        printf("Yes\n");
                        goto out;
                    }
                     if(a[j].s[k]=='1'&&a[j+1].s[k+1]=='1'&&a[j+2].s[k+2]=='0'&&a[j+3].s[k+3]=='1'&&a[j+4].s[k+4]=='1'){
                        printf("Yes\n");
                       goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k+1]=='1'&&a[j+2].s[k+2]=='1'&&a[j+3].s[k+3]=='0'&&a[j+4].s[k+4]=='1'){
                        printf("Yes\n");
                      goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k+1]=='1'&&a[j+2].s[k+2]=='1'&&a[j+3].s[k+3]=='1'&&a[j+4].s[k+4]=='0'){
                        printf("Yes\n");
                       goto out;
                    }
                }
                if(j+4<15&&k-4>=0){
                    if(a[j].s[k]=='0'&&a[j+1].s[k-1]=='1'&&a[j+2].s[k-2]=='1'&&a[j+3].s[k-3]=='1'&&a[j+4].s[k-4]=='1'){
                        printf("Yes\n");
                        goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k-1]=='0'&&a[j+2].s[k-2]=='1'&&a[j+3].s[k-3]=='1'&&a[j+4].s[k-4]=='1'){
                        printf("Yes\n");
                       goto out;
                    }
                     if(a[j].s[k]=='1'&&a[j+1].s[k-1]=='1'&&a[j+2].s[k-2]=='0'&&a[j+3].s[k-3]=='1'&&a[j+4].s[k-4]=='1'){
                        printf("Yes\n");
                       goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k-1]=='1'&&a[j+2].s[k-2]=='1'&&a[j+3].s[k-3]=='0'&&a[j+4].s[k-4]=='1'){
                        printf("Yes\n");
                        goto out;
                    }
                    if(a[j].s[k]=='1'&&a[j+1].s[k-1]=='1'&&a[j+2].s[k-2]=='1'&&a[j+3].s[k-3]=='1'&&a[j+4].s[k-4]=='0'){
                        printf("Yes\n");
                        goto out;
                    }
                }   
                
            }
        }
        printf("No\n");
        out:;
    }
}

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

E题目描述

有 nnn 个人同时看中了一种商品。每个人最多愿意支付 aia_iai​ 的钱。如果一个人愿意支付的钱不到设定的价格,那么他不会选择购买这种商品。如果一个人愿意支付的钱不低于设定的价格,他们会按价格买下一件。

你现在是店主,由你来设定价格,使得可以挣到尽可能多的钱。

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void*p1,const void*p2)
{
    return *(int*)p2-*(int*)p1;
}

int main()
{
    int n;
    scanf("%d",&n);
    long long int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%lld",&a[i]);
    }
    qsort(a,n,sizeof(a[0]),cmp_int);
    int ans;
    long long profit=0;
    for(int i=0;i<n;i++)
    {
        
        long long  tem=(long long)a[i]*(i+1);
        if(tem>=profit) {
            profit=tem;
            ans=a[i];}
    }
    printf("%lld %d",profit,ans);
    return 0;
}

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

F题目描述

Prof. Wang 闲暇时喜欢和他的学生小 Z 玩一个益智游戏。两人总共有 333 堆石子,轮流操作。每次可以选定一堆石子,从其中取走 1…k1\dots k1…k 个,不能取的人输。众所周知,Prof. Wang 是个非常为老不尊的老登,所以他总会选择自己先手操作,留给小 Z 后手。在这个问题中,假设 Prof. Wang 和小 Z 都是足够聪明的,并且都想让自己获胜(不存在人情世故)。
Prof. Wang 的实验室门口堆了 nnn 堆石子,他总会大方地让小 Z 从中任选 333 堆,然后进行游戏。小 Z 觉得这样对自己并不是很有利,于是他决定只从其中选择 222 堆,然后自己捏造最后一堆(但你需要注意,这堆不可以为 000)。现在他想知道,在合理的选取之下,捏造的这堆石子最少需要是多大。由于其他因素的影响,石子堆可能会发生一些改变。

也就是说,小 Z 现在面临的问题是这样的:初始有 nnn 堆石子,他需要支持以下三种操作 qqq 次:

  • 1 x 表示增加一堆大小为 xxx 的石子。
  • 2 x 删除一堆大小为 xxx 的石子,保证这样的石子堆存在。
  • 3 询问最小的 正整数 xxx ,使得当前石子堆中存在两堆石子,它们和大小为 xxx 的石子堆进行上述游戏,后手可以必胜。如果不存在这样的 xxx,输出 −1-1−1。

保证任何时刻,石子的堆数总不少于 222 。

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;

const int maxn = 5e5 + 5;
int n, k, Q, a[maxn];
multiset<int> s;  // 维护异或值
multiset<int> t;  // 维护序列
int qwq;  // 维护异或值为0的数对个数

int rd(){
    int x = 0, f = 1;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9'){
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}

void del(int x){
    if(!x) qwq--;
    else s.erase(s.find(x));
}

void add(int x){
    if(!x) qwq++;
    else s.insert(x);
}

void solve(){
    n = rd(), k = rd(), Q = rd(); // 读入 n, k, Q
    for(int i = 1; i <= n; i++){
        a[i] = rd() % (k + 1);
        t.insert(a[i]);
    }
    sort(a + 1, a + n + 1);
    for(int i = 1; i < n; i++){
        add(a[i] ^ a[i + 1]);
    }
    while(Q--){
        int op, x;
        op = rd();  // 读入操作类型
        if(op == 1){
            x = rd() % (k + 1);  // 读入 x
            auto pos = t.lower_bound(x);
            int p1, p2;
            if(pos == t.end()){
                pos--;
                p1 = *pos;
                add(x ^ p1);
            }else if(pos == t.begin()){
                p2 = *pos;
                add(x ^ p2);
            }else{
                p2 = *pos;
                pos--;
                p1 = *pos;
                del(p1 ^ p2);
                add(x ^ p1);
                add(x ^ p2);
            }
            t.insert(x);
        }else if(op == 2){
            x = rd() % (k + 1);
            t.erase(t.find(x));
            auto pos = t.lower_bound(x);
            int p1, p2;
            if(pos == t.end()){
                pos--;
                p1 = *pos;
                del(x ^ p1);
            }else if(pos == t.begin()){
                p2 = *pos;
                del(x ^ p2);
            }else{
                p2 = *pos;
                pos--;
                p1 = *pos;
                add(p1 ^ p2);
                del(x ^ p1);
                del(x ^ p2);
            }
        }else{
            int res = 2147483647;
            if(!s.empty()) res = min(res, *s.begin());
            if(qwq) res = min(res, k + 1);
            cout << res << endl;
        }
    }
}

int main(){

    solve();
}

 

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

G题目描述

明明有 nnn 个长度为 mmm 的字符串,现在老师展示了一个长度为 mmm 的字符串,你需要找到明明有多少个字符串和老师的字符串是相似的。

 

相似的定义为:两个字符串头尾对齐以后,对应位置上有不超过 kkk 个字符是不同的,那么两个字符串是相似的。

 

#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    typedef struct{
        char s[6005];
    }mm;
    mm a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%s",a[i].s);
    }
    char T[m];
    scanf("%s",T);
    int ans=0;
    for(int i=0;i<n;i++)
    {
        int cnt=0;
        for(int j=0;j<m;j++)
        {
            if(a[i].s[j]!=T[j])
                cnt++;
        }
        if(cnt<=k) ans++;
    }
    printf("%d",ans);
    return 0;
}

 链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

H题目描述

作为一名擅长与选手同场竞技的出题人,在大家进行比赛的同时,小w会实时查看大家的提交情况。

小 w 会随机抽取一段提交区间,然后筛选出所有选手的通过的提交,如果这段区间中有一道题目通过数量至少为 kkk 次,那么小 w 会认为这是一道简单题。现在给出你所有答案正确的提交记录,请你计算一下,小 w 看到的简单题的期望种类数是多少。

形式化的,给你一个长度为 nnn 的序列,表示按照时间顺序从早到晚通过的题目编号。小 w 会从中随机挑选一个区间,如果某道题在这个区间内出现至少 kkk 次,那么小 w 会认为其是一个简单题,现在你需要计算小 w 期望看到的简单题种类数,对 998244353998244353998244353 取模后的结果。(即设答案化为最简分式后的形式为 ab\frac{a}{b}ba​ ,其中 aaa 和 bbb 互质。输出整数 xxx 使得 bx=a(mod998244353)bx=a\pmod {998244353}bx=a(mod998244353) 且 0≤x<9982443530\le x< 9982443530≤x<998244353。可以证明这样的整数 xxx 是唯一的。)

小 w 随机挑选区间的方式如下:

首先在 [1,n][1,n][1,n] 中等概率的随机一个右端点R。
然后在 [1,R][1,R][1,R] 中等概率的随机一个左端点L。
最终得到区间 [L,R][L,R][L,R]
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
constexpr int mod = 998244353;

// 快速幂算法
LL qp(LL a, LL b) {
    LL res = 1;
    for (; b; b >>= 1, a = a * a % mod) {
        if (b & 1) {
            res = res * a % mod;
        }
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k;
    cin >> n >> k;

    // 用于存储每个题目的编号
    vector<int> a(n + 1);
    // 用于存储每个题目的出现位置
    vector<vector<int>> G(n + 1);

    // 输入每个题目的编号
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    LL ans = 0, sum = 0;
    for (int i = 1; i <= n; i++) {
        // 将题目i的出现位置加入G数组
        G[a[i]].push_back(i);

        // 计算sum的值:取最新的k个出现位置的和
        if (G[a[i]].size() >= k) {
            sum = (sum + G[a[i]][G[a[i]].size() - k]) % mod;
        }

        // 更新sum的值:减去第(k+1)个最早的出现位置
        if (G[a[i]].size() > k) {
            sum = (sum - G[a[i]][G[a[i]].size() - k - 1] + mod) % mod;
        }

        // 计算ans的值:根据公式 ans += (n^(-1) * i^(-1) * sum)
        ans = (ans + qp(n, mod - 2) * qp(i, mod - 2) % mod * sum) % mod;
    }

    // 输出结果
    cout << ans << '\n';

    return 0;
}

 

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

I题目描述

在妖怪之山上,有两个相互依存,又相互对立的种族:河童和山童。


河童有着先进的机械制造技术,山童有着先进的经济研究,构筑着复杂的金钱系统,但是河童的机械如果没有山童就无法完成,山童的经济若没有河童的制造能力也是暴殄天物。


虽然两者类似,但是生存环境和生活方式大不相同。因此河童称山童为“区区住在林子里的猴子”,而山童称河童为“区区住在河里的两栖类”。


由于他们的专业技术离不开数字,为了证明能力,河童和山童之间开始了一场数字对决。

 

 

(pixivID:98502091,左边是山城高岭,右边是河城荷取)


数字对决的规则如下:
- 河童和山童两方各自确定一个数字区间,分别为 [l1,r1][l_1,r_1][l1​,r1​] 和 [l2,r2][l_2,r_2][l2​,r2​] 。其中, l1,r1,l2,r2l_1,r_1,l_2,r_2l1​,r1​,l2​,r2​ 均为正整数且 l1≤r1l_1 \le r_1l1​≤r1​、 l2≤r2l_2 \le r_2l2​≤r2​ 。双方都在各自的数字区间内分别同时独立随机选取正整数 x1x_1x1​ (l1≤x1≤r1)(l_1 \le x_1 \le r_1)(l1​≤x1​≤r1​) 和 x2x_2x2​ (l2≤x2≤r2)(l_2 \le x_2 \le r_2)(l2​≤x2​≤r2​) 。若 x1>x2x_1 > x_2x1​>x2​ ,则河童一方胜;若 x1<x2x_1 < x_2x1​<x2​ ,则山童一方胜;若 x1=x2x_1 = x_2x1​=x2​ ,则判定为平局。(注:独立选取代表着选取数字的概率不受对方影响。随机选取为等概率选取,即在一段区间内所有正整数被选取的概率是一样的。)


现在,河城荷取(河童代表)和山城高岭(山童代表)之间要进行 nnn 场数字对决。作为裁判员,对于每场数字对决,河城白露需要判断谁获胜的概率高。

 

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        long long int l1,r1,l2,r2;
        scanf("%lld %lld %lld %lld",&l1,&r1,&l2,&r2);
        if(r1-r2>l2-l1) printf("Nitori Win\n");
        else if(r1-r2==l2-l1) printf("Draw\n");
        else printf("Takane Win\n");
    }
    return 0;
}

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

J题目描述

小 Z 有一个只包含小写英文字母的字符串 SSS 。

小 Z 还会一种奇妙的字符魔法,每次使用魔法可以将字符串 SSS 中的一个字符改变成任意一个小写英文字母。

发动魔法非常耗费小 Z 的精力,因此他想知道,如果想让 SSS 中下标为 lllrrr 的字符都变成相同的小写字母,最少需要使用几次魔法。

小 Z 对这样的问题非常感兴趣,因此他会询问 mmm 次这样的问题。请注意,小 Z 只是进行询问,并不会真的使用魔法对字符串进行修改。

 

#include<stdio.h>
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    char s[n];
    scanf("%s",s);
    int ans=0;
    int dp[n+1][256];
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<256;j++)
        {
            dp[i][j]=0;
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<256;j++)
        {
            dp[i+1][j]=dp[i][j];
        }
        dp[i+1][s[i]]++;
    }
    for(int i=0;i<m;i++){
        int ans=0;
        int l,r;
        scanf("%d%d",&l,&r);
        for(int j=0;j<256;j++){
            int tem=dp[r][j]-dp[l-1][j];
            ans=(tem>ans)?tem:ans;
        }
        ans=r-l+1-ans;
        printf("%d\n",ans);
    }
}

这里hash表可以改下变成dp[i + 1][s[i] - 'a'],差不多。

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

K题目描述

小 Z 有一个序列 {ai}\{a_i\}{ai​}。

 

对于一个子序列 ai1,ai2,…,ai,ka_{i_1},a_{i_2},\dots,a_{i,k}ai1​​,ai2​​,…,ai,k​(i1<i2<⋯<iki_1< i_ 2<\dots < i_ki1​<i2​<⋯<ik​)。如果这个 子序列中的数按位异或的结果 等于 不在子序列中的数按位异或的结果 ,则该子序列是优美的。

 

按位异或,即 C++/Java 中的 ^ 运算符,对于任意的非负整数 x,按位异或运算满足 x ^ x = 0, x ^ 0 = x。

 

现在小 Z 想知道序列中有多少个子序列是优美的。请注意,在小 Z 的定义中,子序列的长度可以为 0。

#include<stdio.h>
typedef long long ll;
int main(void)
{
    long long a,ans=0;
    int n;
    scanf("%d",&n);

    for(int i=0;i<n;i++)
    {
        scanf("%d",&a);
        ans=a^ans;
    }
    if(!ans) printf("%lld",(ll)2<<n-1);
    else printf("0");
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值