Codeforces Round 189 (Div. 2) A. Magic Numbers

123 阅读2分钟

题目链接

题目详情

A magic number is a number formed by concatenation of numbers 1, 14 and 144. We can use each of these numbers any number of times. Therefore 14144, 141414 and 1411 are magic numbers but 1444, 514 and 414 are not.

You're given a number. Determine if it is a magic number or not.

Input

The first line of input contains an integer n, (1 ≤ n ≤ 109). This number doesn't contain leading zeros.

Output

Print "YES" if n is a magic number or print "NO" if it's not.

大意及解题思路

大意:
幻数是由数字1、14和144串联而成的数字。我们可以多次使用这些数字中的每一个。因此14144、141414和1411是幻数,但1444、514和414不是。你会得到一个数字。判断它是否是一个幻数。输入输入的第一行包含一个整数n,1n109)(1 ≤ n ≤ 10^9). 此数字不包含前导零。如果n是幻数,则输出打印“YES”,如果不是,则打印“NO”。
解题思路
这道题很其实很简单,首先我们最容易想到的就是判断这个数中有没有除了1和4以外的数,如果有的话直接输出NO。否则的话再继续进行判断。我们再仔细观察,会发现,最开头的数即s[1]如果不是1的话一定不符合要求,这个条件可以和上面一个条件一起判断。其次,我们会发现,如果是magic number,一定不会出现2个以上连续的4。如果有的话就不符合,输出NO。到此为止,我们就把所有不可能情况全部排除。最后如果不是NO,就输出YES。需要注意的是,第二个循环的条件要写成i+2 < s.size();不能写成i < s.size()-2;否则会发生小标越界!!! input

114114

output

YES

input

1111

output

YES

input

441231

output

NO

AC代码

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{   

    string s;
    cin >> s;
   for (int i = 0; i < s.size(); i++)
    {
        if (s[i] != '1' && s[i] != '4' || s[0]!='1')
        {
            cout << "NO" << endl;
            return 0;
        }
    }
    for (int i = 0; i+2 < s.size(); i++)
    {
        if (s[i] == '4' && s[i + 1] == '4' && s[i + 2] == '4') 
        {
            cout << "NO" << endl;
            return 0;
        }
    }
    cout << "YES" << endl;


    return 0;
}