Educational Codeforces Round 98 (A~D)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值