1 条题解

  • 0
    @ 2025-8-24 22:39:19

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 22:39:19,当前版本为作者最后更新于2022-08-07 17:16:38,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    解法一

    我们可以使用一个桶 b[],将牌全部存入桶中。这样,当 b[i]>=4 即可表明有炸弹,而当 b['D']>0 && b['X']>0 就说明有大小王存在。这样即可通过本题。注意开桶的做法要多测清空,否则罚时两行泪。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int main()
    {
        int T,b[128];
        cin >> T;
        while (T--)
        {
            memset(b,0,sizeof(b));//多测清空
            bool flag=false;
            string s;
            cin >> s;
            for (int i=0;i<s.length();i++)//将牌放入桶中
                b[s[i]]++;
            if (b['X']>0 && b['D']>0)//判断是否存在大小王
                flag=true;
            for (int i=1;i<=127 && !flag;i++)//判断是否存在炸弹
            {
                if (b[i]>=4)
                    flag=true;
            }
            puts(flag?"Yes":"No");
        }
        return 0;
    }
    

    解法二

    实际上,由于牌已经保证了被理好,因而我们可以直接扫一遍牌。对于字符串 s,只要有 s[i]==s[i+1] && s[i+1]==s[i+2] && s[i+2]==s[i+3],即可说明存在炸弹。由于只有一副牌,因此只要判断 s[0]s[1] 是否是王即可。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int main()
    {
        int T;
        cin >> T;
        while (T--)
        {
            bool flag=false;
            string s;
            cin >> s;
            if (s[0]=='D' && s[1]=='X')//判断大小王
                flag=true;
            for (int i=0;i<s.length()-3 && !flag;i++)//扫描一遍牌,看是否存在炸弹
            {
                if (s[i]==s[i+1] && s[i+1]==s[i+2] && s[i+2]==s[i+3])
                    flag=true;
            }
            puts(flag?"Yes":"No");
        }
        return 0;
    }
    
    • 1

    信息

    ID
    7828
    时间
    2000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者