SDUT2190救基友记1

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2190

思路 : 这个题,一开始以为是博弈,以为大概几行核心代码就搞的定,结果应该算是一个简单数学小题吧,考的是思维。按题中要求,可以得出,主要分为两种情况,一种是考虑这一数串的每个数字之和能被三整除和不能被三整除的,如果能被三整除,就判断被3整除的数字的个数有奇数个还是偶数个,如果是奇数个就是妖怪输。而不能被三整除的时候,就要去看和对3取余余几 ,如果余的数在原串里找得到或者是原串某个数对3取余与这个余数相等,那第一步的WP就必须拿掉这个数才符合规则,所以剩下的又是判断剩下的数中能被3整除的数是奇数个还是偶数个

#include<iostream>
#include<string>
using namespace std ;
int main()
{
    int n ;
    cin>>n;
    for(int i = 0 ; i < n ; i++)
    {
        string str ;
        cin>>str ;
        int sum = 0 ;
        int cnt = 0 ;
        for(int j = 0 ; j < str.length() ; j++)
        {
            sum += (str[j]-'0') ;
            if(str[j] % 3 == 0)
                cnt++ ;
        }
        int flag = 0 ,mark = 0;
        if(sum % 3 == 0)
        {
            if(cnt % 2 == 0)
            {
                flag = 1 ;
            }
        }
        else
        {
            int len = sum%3 ;
            for(int j = 0 ; j < str.length() ; j++)
            {
                if(len == (str[j]-'0')%3)
                {
                    mark = 1;
                    break ;
                }
            }
            if(mark)
            {
                if(cnt%2 == 1)
                {
                    flag = 1 ;
                }
            }
        }
        cout<<"Case "<<i+1<<": ";
        if(flag)
            cout<<"T"<<endl ;
        else
            cout<<"S"<<endl ;
    }
    return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3416994.html