牛客小白月赛76

猜拳游戏

牛客小白月赛76_第1张图片牛客小白月赛76_第2张图片

思路分析

推导一个即知长途说他出剪刀,诱使你出石头,所以他真正出布,你真正得出剪刀才能赢他。

时间复杂度

O(1)

代码

#include
using namespace std;
int main()
{
    string s;
    cin>>s;
    if(s=="shitou"){
        cout<<"shitou"<<endl;
    }else if(s=="jiandao"){
        cout<<"jiandao"<<endl;}
        else{
        cout<<"bu"<<endl;}
    return 0;
}

Kevin喜欢一

牛客小白月赛76_第3张图片牛客小白月赛76_第4张图片在这里插入图片描述

思路分析

令x为每次的1都全部复制,当x>=n就不用操作(op)了,所以while(x

时间复杂度

O(logn)

代码

#include
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int x=1,op=0;
        while(x<n)
        {
         op++;
         x*=2;
        }
        cout<<op<<endl;
    }
}

A加B,A模B

牛客小白月赛76_第5张图片在这里插入图片描述
牛客小白月赛76_第6张图片

思路分析

  • 若能找到合法的a,b,即方程有解:
    • 由 amod  b=m 得 a=kb+m,b>m,k≥0
    • 由 a+b=n 得 (k+1)b+m=n,(k+1)≥1

所以由b>m, (k+1)b+m=n,(k+1)≥1,得n>2*m时满足,方程有解

  • a,b怎样合法
    • 根据题目给出的条件a+b=n和a mod b=m,我们可以得出以下推导:
      a mod b = m
      => a = b * k + m (其中k为非负整数)
      将a的表达式代入a+b=n中,得到:
      b * k + m + b = n
      => b * (k+1) = n - m
      => b = (n - m) / (k + 1)
      根据上述推导,只有当(n-m)能被(k+1)整除时,才能找到合法的a和b。

因此,当k=0时,b=n−m,a=m 是一种可行的构造方式。

时间复杂度

O(n)

代码

#include 
using namespace std;

int main() {
    int T;
    cin >> T;

    while (T--) {
        int n, m;
        cin >> n >> m;

        if (n > 2 * m) {
            int a = m;
            int b = n - m;
            cout << a << " " << b << endl;
        } else {
            cout << -1 << endl;
        }
    }

    return 0;
}

MoonLight的运算问题4

牛客小白月赛76_第7张图片牛客小白月赛76_第8张图片牛客小白月赛76_第9张图片

思路分析

防止x的值在运算过程中超出mod的范围,从而得到错误的结果。

  • if(x>mod)x%=mod,x+=mod;
    如果没有进行取模操作并且超出了mod的范围,那么x可能会变得非常大,超过了数据类型所能表示的上限。会导致结果溢出:超出数据类型的上限后,x的值可能会溢出,变得负数或者变成一个不可预测的值,无法正确表示计算结果。

所以要边取模边运算

时间复杂度

代码

#include
using namespace std;
const int mod=998244353;
const int N=2e5+5;
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        long long x=0;
        int a[N];
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            x=max(a[i]*x,a[i]+x);
           if(x>mod)x%=mod,x+=mod;
        }
        cout<<x%mod<<endl;
    }
}

你可能感兴趣的:(算法)