A. Robot Program
题目链接:A题
题目大意:
一个机器人一开始位于(0,0),有五种指令:向上下左右四个方向走一步或者不动,机器人不能执行同一个指令两次
给出坐标(x,y)问机器人最少需要几个指令走到该点?
分析:
如果x=y,则机器人可以不断向下一步、向右一步直至走至(x,y)点,也就是不会违背上面机器人不能执行同一个指令两次的规则,所需操作次数就是x+y
走法如下:
由这个图可以看出,如果x=y±1,也可以不违背上面的规则走到目的地,即x+y次操作
由此有了一个猜测:这道题和x,y差值的绝对值有关
如果x=y±2,那么显然不可能在不违背上面的规则直接走到目的地,要绕路
比如x=2,y=4;
则最快的走法:最快地走到(2,3)点,需要5次操作,然后因为不能继续向右走,停顿一下,也就是说需要浪费一次操作
如果x=2,y=4,就停顿两下,也就是浪费两次操作
规律:
对于任意的x,y
如果x-y的绝对值为1或0,则不会浪费操作次数
如果x-y的绝对值大于1,则需要浪费该绝对值-1的操作次数
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",x+y+max(abs(x-y)-1,0));
}
return 0;
}
B. Toy Blocks
题目链接:B题
题目大意:
n个盒子,每个盒子最开始有
a
i
a_i
ai个玩具,如果希望达到以下的状态至少要加入几个玩具:从n个盒子中任选一个盒子,将这个盒子里的玩具分到其它盒子里,分法自己决定,都有方案能使剩下的n-1个盒子玩具数相同,
分析:
将其中一个盒子的玩具数转移到剩下n-1个盒子后,这n-1个盒子玩具数相同,说明玩具的总数必须是n-1的倍数
因为任选一个盒子,都要有方案,假设n个盒子中第盒子玩具数最多的盒子个数为x,如果我们选择了其它盒子进行分配,则n-1个盒子玩具数起码为x*(n-1)
由此答案已经得出:
玩具的总数必须是n-1的倍数,且至少大于x*(n-1),然后计算当前玩具数,如果当前玩具数少于x*(n-1),补上即可,若果多于,则将玩具数补至(x+1)*(n-1)个即可
注意:
①特判n=2时的答案(为0)
②开long long
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
long long n;
scanf("%lld",&n);
long long mx=0;
long long sum=0;
for(int i=0;i<n;i++){
long long temp;
scanf("%lld",&temp);
mx=max(mx,temp);
sum+=temp;
}
long long ans=mx*(n-1)-sum;
while(ans<0)
ans+=(n-1);
if(n==2) ans=0;
cout<<ans<<endl;
}
return 0;
}
ps:被hack了嘤嘤嘤,问题出在 while(ans<0) ans+=(n-1);
这句话上,会超时,改成ans=(n-1-sum%(n-1))%(n-1);
就行
C. Two Brackets
题目链接:C题
题目大意:
给你一串括号,有()和[]两种,问你最多有多少对互相匹配的括号,这里匹配的定义是(在前,)在后且不需要连续
分析:
答案显然通过右括号判断,从左向右遍历判断每个右括号前是否有还未被匹配的左括号,若存在则答案++
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
string s;
cin>>s;
int num1=0,num2=0;
int ans=0;
for(int i=0;i<s.size();i++){
if(s[i]=='(') num1++;
else if(s[i]=='[') num2++;
else if(s[i]==')'){
if(num1>0)
num1--,ans++;
}
else{
if(num2>0)
num2--,ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
D. Radio Towers
题目链接:D题
题目大意/分析:
不翻译了,反正这题我也是找规律的阿巴阿巴。分析半天,最后算了下n<5时的情况,发现答案为斐波那契数/
2
n
2^n
2n
代码:
#include <bits/stdc++.h>
using namespace std;
const long long mod=998244353;
long long quickpow(long long base,long long power){
long long ret=1;
while(power){
if(power%2) ret=ret*base%mod;
base=base*base%mod;
power/=2;
}
return ret;
}
long long inv(long long x){
return quickpow(x,mod-2)%mod;
}
int main()
{
long long n;
scanf("%lld",&n);
long long a=1;
long long b=1;
long long c;
for(int i=2;i<n;i++){
c=a+b; c%=mod;
a=b; a%=mod;
b=c; b%=mod;
}
if(n==1||n==2) c=1;
printf("%lld",c*inv(quickpow(2,n))%mod);
return 0;
}