zoukankan      html  css  js  c++  java
  • Codeforces I. Inna and Nine(组合)

    题目描述:

    Inna and Nine

    time limit per test

    1 second

    memory limit per test

    256 megabytes

    input

    standard input

    output

    standard output

    Inna loves digit 9 very much. That's why she asked Dima to write a small number consisting of nines. But Dima must have misunderstood her and he wrote a very large number a, consisting of digits from 1 to 9.

    Inna wants to slightly alter the number Dima wrote so that in the end the number contained as many digits nine as possible. In one move, Inna can choose two adjacent digits in a number which sum equals 9 and replace them by a single digit 9.

    For instance, Inna can alter number 14545181 like this: 14545181 → 1945181 → 194519 → 19919. Also, she can use this method to transform number 14545181 into number 19991. Inna will not transform it into 149591 as she can get numbers 19919 and 19991 which contain more digits nine.

    Dima is a programmer so he wants to find out how many distinct numbers containing as many digits nine as possible Inna can get from the written number. Help him with this challenging task.

    Input

    The first line of the input contains integer a (1 ≤ a ≤ (10^{100000})). Number a doesn't have any zeroes.

    Output

    In a single line print a single integer — the answer to the problem. It is guaranteed that the answer to the problem doesn't exceed (2^{63 - 1}).

    Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.

    Examples

    Input

    Copy

    369727
    

    Output

    Copy

    2
    

    Input

    Copy

    123456789987654321
    

    Output

    Copy

    1
    

    Input

    Copy

    1
    

    Output

    Copy

    1
    

    Note

    Notes to the samples

    In the first sample Inna can get the following numbers: 369727 → 99727 → 9997, 369727 → 99727 → 9979.

    In the second sample, Inna can act like this: 123456789987654321 → 12396789987654321 → 1239678998769321.

    思路:

    题目是要给一个数字串,两个相邻的数字加起来是9的话可以合并,问在9最多的情况下最多可以得到多少种不同的数字串。

    刚开始看这道题看起来非常麻烦,这个,,,怎么做,我要怎么找有几个加起来等于9还不同的情况,确定一个什么策略可以区分并尝试加成不同的数,一个一个试?递归?动态规划?看一眼数据范围,直接10^5,限时一秒枚举不够啊。这就说明有更简洁的方法。

    只能一个一个找规律了。

    我们现看看样例14545181,这个九要最多,只能19991或19919,也就是说中间的4545刚好组成两个9就不能拆开,拆开会少。那么什么情况下会有多种可能呢?我们把注意力转向181,就是这个产生了两种可能。

    我们便发现,要想有多种可能,必须满足一个性质:一个数和左边加起来是9,和右边加起来也是9

    举个栗子:1454541

    我们发现两边的1对结果毫无影响,因为它们并不能凑一个9出来,于是去掉,得到45454,这有几种情况呢?994,949,499三种,这个串里面我们发现刚好有5,4,5这三个数满足上面的性质

    再来:454,有94和49两种,有5一个数满足上面的性质

    数在长一点:4545454有4999,9499,9949,9994四种,满足上述性质的串中的数有5,4,5,4,5这五个

    要是长度为偶数呢?4545,我们发现只有99一种可能,而其中满足性质的有5,4两个数

    发现规律没有?只有当满足性质的数有奇数个,才有多种可能,偶数个只可能为一

    而且满足性质的数和产生的可能性有如下关系:(a_n=(n+3)/2)(n)为满足性质的数的个数,且为奇数,(a_n)为可能的种数。

    现在问题只剩下如何识别具有这种模式的串中数字的个数。就按性质来识别就好了,遍历除开头结尾的每个数,看是不是满足性质,是就把个数加一。注意的是满足性质的字串不一定是连续的,串断裂后及时把计数变量清零。还有注意个数为偶数的情况并不贡献可能性。

    代码:

    #include <iostream>
    #include <string>
    using namespace std;
    string s;
    long long judge(string s)
    {
        long long ans = 1;
        long long num = 0;
        for(int i = 1;i<s.size()-1;i++)
        {
            if(s[i-1]+s[i]-2*'0'==9&&s[i]+s[i+1]-2*'0'==9)
            {
                num++;
            }
            else if(num%2==1)
            {
                ans = ans*((num+3)/2);
                //cout << "num " << num << endl;
                num = 0;
            }
            else
            {
                num = 0;
            }
        }
        if(num%2==1)
        {
            ans = (ans*(num+3)/2);
        }
        return ans;
    }
    int main()
    {
        cin >> s;
        long long ans = judge(s);
        cout << ans << endl;
        return 0;
    }
    
    
  • 相关阅读:
    2.采用字符的移位方式实现字符文本加密解密。
    用自己的算法实现startsWith和endsWith功能。
    采用多种算法,模拟摇奖:从1-36中随机抽出8个不重复的数字
    输入5个数用冒泡排序进行从小到大排列
    题目六:控制台输入年龄,根据年龄输出不同的提示
    题目五:控制台输出三角形和菱形
    题目四:控制台输出九九乘法表
    百马百担
    classNum 表示学生的班号,例如“class05”。 有如下List  List list = new ArrayList();
    已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数     2008 北京奥运会男足参赛国家:  科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利
  • 原文地址:https://www.cnblogs.com/zhanhonhao/p/11288445.html
Copyright © 2011-2022 走看看