牛客月赛87

文章探讨了两个与IT技术相关的数学游戏:石子游戏中Alice和Bob的策略,以及如何通过最少操作使数组变为非降序。文章涉及算法分析和优化问题,展示了聪明玩家如何在规则下预测比赛结果和最小化操作影响。
摘要由CSDN通过智能技术生成

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

Alice 和 BobBobBob 又在玩石子游戏了。

具体的,现在有 nnn 堆石子,第 iii 堆石子里面有 aia_iai​ 个石子,且石子数量按升序排列。AliceAliceAlice 和 BobBobBob 轮流操作,AliceAliceAlice先手操作,当前玩家从剩余的石子堆中任选一堆石子全部拿走,然后轮下一个玩家拿石子。直到所有的石子都被拿完,游戏结束。

当游戏结束时,如果 AliceAliceAlice 拿到的石子总数严格大于 BobBobBob 所拿到的石子总数,则 AliceAliceAlice 获胜,否则 BobBobBob 获胜。
假设 AliceAliceAlice 和 BobBobBob 都绝顶聪明,一定会以最优解拿石子,小苯想知道最终谁会成为最后的赢家,请你帮帮他预测一下吧。

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int x=0,y=0,n,k;
        scanf("%d",&n);
        if(n%2==1)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&k);
                if(i%2==1)
                    x+=k;
                else
                    y+=k;
            }
        }
        else
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&k);
                if(i%2==1)
                    y+=k;
                else
                    x+=k;
            }
        }
        if(x>y)
            printf("Alice\n");
        else
            printf("Bob\n");
    }

}

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

小苯有一个长度为 nnn 的数组 aaa,他可以对 aaa 进行至多一次以下操作:

 ∙\bullet∙  选择一段区间 [l,r][l, r][l,r], 满足 (1≤l≤r≤n)(1 \le l \le r \le n)(1≤l≤r≤n),且区间长度严格小于 nnn,将数组 aaa 的 [l,r][l, r][l,r] 这段区间按非降序排序。

换句话说,操作执行完后,区间中的值将满足:a[l]≤a[l+1]≤a[l+2]≤...≤a[r]a[l] \le a[l+1] \le a[l+2] \le...\le a[r]a[l]≤a[l+1]≤a[l+2]≤...≤a[r]。

现在小苯想知道能否通过执行最多一次操作使得数组 aaa 按非降序排列。

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,min=1e9,max=-1,a[200005];
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]>max)
                max=a[i];
            if(a[i]<min)
                min=a[i];
        }
        if(a[0]==min||a[n-1]==max)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

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

众所周知,通常的代码编辑器(如当前页面右侧的牛客在线编辑器)都比较智能。


如果您输入一串括号串,例如:(I)(I)(I) 其中的 III 代表鼠标光标。
此时如果按下键盘中的 backspacebackspacebackspace 键,整个括号都会被删掉,也就是说括号串会变成 III,只包含鼠标光标。
但是如果按下键盘中的 deletedeletedelete 键,那么则只会删除括号的右侧部分,也就是说括号串会变为 (I(I(I 。

但如果鼠标光标不处于一个匹配的括号串中间,例如:()I()I()I
此时按下 backspacebackspacebackspace 键,括号会变为 (I(I(I 。
此时按下 deletedeletedelete 键,由于光标右侧没有括号,因此括号不会发生变化。

类似的,如果括号串为:I()I()I() 。
此时按下 backspacebackspacebackspace 键,由于鼠标光标左侧没有括号,因此括号不会发生变化。

此时按下 deletedeletedelete 键,括号会变为:I)I)I)。

问题:现在小苯给了你一个长度为 nnn 的括号串,并且保证其中恰好出现了一个 III 字符表示鼠标光标。他想知道,在 kkk 次指定的删除操作后,括号串最终会是什么样子,请你帮帮他吧。

#include<stdio.h>
int main()
{
    int n,k,b,x=1,y=1;
    char s[200005],a[200005]={0};
    scanf("%d %d",&n,&k);
    getchar();
    for(int i=0;i<n;i++)
    {
        scanf("%c",&s[i]);
        if(s[i]=='I')
            b=i;
    }
    while(k--)
    {
        char c[15];
        scanf("%s",c);
        if(c[0]=='b')
        {
            int f=0;
            if(b-x>=0)
            {
                a[b-x]=1;
                x++;
                if(s[b-x]=='(')
                    f=1;
            }
            if(f==1)
            {
                if(b+y<n&&s[b+y]==')')
                {
                    a[b+y]=1;
                    y++;
                }
            }
        }
        else
        {
            if(b+y<n)
            {
                a[b+y]=1;
                y++;
            }
        }
    }
    for(int i=0;i<n;i++)
        if(a[i]==0)
            printf("%c",s[i]);
    return 0;
}

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

大白熊给了小苯一个长度为 nnn 的数组 aaa,他希望小苯将数组 aaa 变成有序(非递减)的。具体的,小苯需要进行如下操作:

   1.1.1. 任选一个数组 bbb,长度也为 nnn,且元素满足:−1010≤bi≤1010-10^{10} \le b_i \le 10^{10}−1010≤bi​≤1010。

   2.2.2. 对于所有 1≤i≤n1 \le i \le n1≤i≤n,都执行 ai=ai+bia_i = a_i + b_iai​=ai​+bi​。

大白熊希望在执行完操作后 aaa 数组满足有序,同时要最小化数组 bbb 的极差,即使得:max(b1,b2,...,bn)−min(b1,b2,...,bn)max(b_1, b_2, ..., b_n) - min(b_1, b_2,...,b_n)max(b1​,b2​,...,bn​)−min(b1​,b2​,...,bn​)最小 。

请你帮小苯找出一个合法的 bbb 数组吧。

注:如有多解输出任意即可。

#include<stdio.h>
int main()
{
    long long n,a[200005],b[200005],t;
    scanf("%lld",&n);
    for(int i=0;i<n;i++)
        b[i]=-1e9;
    scanf("%lld",&a[0]);
    t=a[0];
    for(int i=1;i<n;i++)
    {
        scanf("%lld",&a[i]);
        if(a[i]<t)
        {
            b[i]=-1e9+t-a[i];
        }
        else
        {
            t=a[i];
        }
    }
    for(int i=0;i<n;i++)
        printf("%lld ",b[i]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值