链接:登录—专业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;
}