零点工作室暑假集训(牛客小白月赛76)

这篇文章讨论了一个猜拳游戏的策略问题,玩家需要对抗一个试图误导你的对手。关键在于理解对手会出能赢你的手势,反其道而行之。AC代码展示了如何根据对手声称的手势来选择获胜的手势。此外,还包含了两个其他编程问题的解决方案,涉及数学和逻辑运算。
摘要由CSDN通过智能技术生成

A - 猜拳游戏

题意 :你正在与长途玩石头剪刀布的猜拳游戏。请回忆石头剪刀布的游戏规则: 两个人同时伸出手,分别出示石头 (用 shitou 表示) 、剪刀(用jiandao 表示)或布(用 bu 表示)的手势。石头胜刀,剪刀胜布,布胜石头。如果两个人出示的手势相同,则是平局,需要重新进行游戏。在开始游戏之前,长途会告诉你他要出石头、剪刀还是布。然而实际上,长途是在欺骗你。他认为你会相信他的话,并且认为你一定会根据他说的话选择能战胜他的手势 (例如,他说他会出石头,他便认为你会出布) 。所以最终,长途不会按照他告诉你的手势出拳,而是选择自己所认为一定能战胜你的手势。现在你已经看透了他的小心思。请问,在知道他告诉你他要出什么手势的情况下,你应该出什么手势才能取胜?

思路:出一样的手势即可

AC代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1000010, mod = 998244353;

typedef long long LL;

string s;

int main() 
{
    cin >> s;
    if(s == "bu") cout << "bu";
    if(s == "shitou") cout << "shitou";
    if(s == "jiandao") cout << "jiandao";
    
    return 0;
}

B - Kevin喜欢一

题意: 在这里插入图片描述
思路 :判断n什么时候小于等于2的几次方,然后输出幂的大小

AC代码

#include <iostream>

using namespace std;

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

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

        int cnt = 1;  
        int ans = 0;  

        while (cnt < n) 
        {
            cnt *= 2;
            ans ++;
        }

        cout << ans << endl;
    }

    return 0;
}

C - A加B,A模B

题意: 在这里插入图片描述

思路:可以根据题目给出关的式子推出公式 即 a = m, b = n - m.推的过程中因为K >= 0,所以为了简便当K = 0的时候式子最简单,所以取0;然后因为a mod b = m 即 m mod (n - m) = m;因为m 必须 大于 n - m所以a < b的这种情况考虑进去;其他情况为 -1
在这里插入图片描述
AC代码

#include <iostream>

using namespace std;

const int N = 1000010, mod = 998244353, INF=0x3f3f3f3f;

typedef long long LL;

int main()
{
	int T;
	cin >> T;
	while(T --)
	{
		LL n, m;
		cin >> n >> m;
		LL ans = n - m;
		LL res = m; 
		if(ans <= 0)
        {
            cout<< "-1" << endl;
        }
		else if(m >= ans)
        {
            cout << "-1" << endl;
        }
		else cout << res << " " << ans << endl;
	 } 
    
	return 0;
}


D - MoonLight的运算问题

题意: 在这里插入图片描述

思路: 因为当 x或者ai取0或1时肯定会选择加法,那么当x大于1时就标记一下,然后x大于1并且ai也必须大于1时,这时候就取乘法就行了;
在这里插入图片描述

AC代码

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 200010 , INF = 0x3f3f3f3f , mod = 998244353;

LL a[N];
int T, n;

int main() 
{
    cin >> T;
    while (T --)
    {
        cin >> n;
        LL x = 0;
        int flag = 0;
        for(int i = 1; i <= n; i ++)
        {
            cin >> a[i];
            if(a[i])
            {
                if(a[i] > 1 && flag)
                {
                    x = x * a[i] % mod;
                }
                else
                {
                    if(x + a[i] > 1)
                    {
                        flag = 1;
                    }
                    x = (x + a[i]) % mod;
                    
                }
            }
        }
        
        cout << x << endl;
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值