Educational Codeforces Round 98 (Rated for Div. 2)——A,B,C,D Codeforces 1452 A-D

1 篇文章 0 订阅
1 篇文章 0 订阅

题目A:

题解:这是一道思维题,给你一个坐标(x,y),问你从原点到这个坐标最少需要多少步,每次可以上下左右或者在原地不动,相邻两次的操作不能相同,画个图,找找规律

就可以得到答案了。

#include<iostream>
#include<cmath>
#include<algorithm>
 
using namespace std;
 
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int x,y;
        cin>>x>>y;
        if(fabs(x-y)<=1)
        {
            cout<<x+y<<endl;
        }
        else
        {
            cout<<max(x,y)*2-1<<endl;
        }
    }
    return 0;
}

 

题目B:

题解:题目大概意思是说给你n个盒子,每个盒子里放有一些积木,现在需要向盒子里加入一些积木,使任意一个盒子的积木拿出放到其他盒子里(可以拆成多份放入不同的盒子里),都有剩余的(n-1)个盒子的积木数量都相等;请输出最少需要放入多少个积木。

<1>用一个数组 md 记录每个盒子的积木数量,由于要求加入后对于每个盒子都满足题意,所以当积木数量最大的盒子(设积木数量为max)不是选择的盒子时,这是就要保证(n-1)盒子的积木数量大于等于max;这是一个边界状态,所以先将数组从小到大排序,最大的为md[n],最小的为md[1],由于积木数量最小,可假设增加的积木都放在md[1]上(之后将md[1]的所有积木分配到其他盒子里使(n-1)个盒子里积木数量相等),这时从2个盒子到n-1个盒子的数量都加到和md[n]相等,用sum记录一下,遍历一遍就得到了。

<2>这时会遇到两种情况,sum大于等于md[1]时,这时直接输出 sum-md[1] ;但是当sum小于md[1]时,这时我不用加积木已经能使剩余的盒子积木相等,而且还有多的,这些多的怎么处理,这时肯定是将剩余的积木平均分配到(n-1)个盒子里,如果不能平均加到能平均为止。

代码如下:

#include<iostream>
#include<algorithm>

using namespace std;

int md[100005];

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>md[i];
        }

        sort(md+1,md+1+n);//排序

        long long sum=0;//注意这里的sum要用long long范围,不然int会爆掉
        for(int i=2;i<n;i++)
        {
            sum+=md[n]-md[i];
        }
        if(sum>=md[1])
        {
            cout<<sum-md[1]<<endl;
        }
        else
        {
            md[1]-=sum;//剩余积木数量
            int ans=0;
            while(md[1]%(n-1)!=0)
            {
                md[1]++;//加到能平均分配为止
                ans++;
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}

 

题目C:

题解:读完题后,肯定知道是用栈去做,开两个栈去分别存储"()"和"[]"。代码里有解释,不多说了。

 

#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
 
using namespace std;
 
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin.ignore();
        string s;
        cin>>s;
        int ans1=0,ans2=0;
        stack<char> a1,a2;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='(')//出现了'(',将其压入栈中
            {
                a1.push('(');
            }
            if(s[i]==')'&&!a1.empty()&&a1.top()=='(')//注意访问栈顶元素时,注意栈是否为空
            {
                ans1++;//当出现了')',而栈顶刚好有一个'(',这时可以匹配成功,ans加1;
                a1.pop();//这时将栈顶的元素删除
            }
            if(s[i]=='[')
            {
                a2.push('[');
            }
            if(s[i]==']'&&!a2.empty()&&a2.top()=='[')
            {
                ans2++;
                a2.pop();
            }
        }
        cout<<ans1+ans2<<endl;
    }
    return 0;
}

题目D:

题解:有 n+2 个发射站,编号为 0 和 n+1 的发射站不能被接收信号,编号为 1~n 的发射站都可以发射信号,信号强度为 c 时,可以传送至编号为 [i-c,i+c] 的发射站上,但是每个发射站只能有一个信号,每个发射站无论信号强度是多少其有信号的概率是 1/2,求 1~n 都有信号的概率。输出概率mod上 998244353。

           找一下规律,分母为2^n ,分子为斐波那契数列,答案为 f[n]/(2^n) mod 998244353,由此联想到费马小定理和快速幂。

代码:

#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define mod 998244353

ll md[200005];

ll quick_pow(ll a,ll b)//快速幂
{
    ll res=1;
    while(b)
    {
        if(b&1)
            res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

int main()
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    md[1]=md[2]=1;
    for(int i=3;i<=n;i++)
    {
        md[i]=(md[i-1]+md[i-2])%mod;
    }

    ll ans=md[n]*quick_pow( quick_pow(2,n),mod-2)%mod;
    cout<<ans<<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值