zoukankan      html  css  js  c++  java
  • UVA 10198 Counting

    Counting

    The Problem

    Gustavo knows how to count, but he is now learning how write numbers. As he is a very good student, he already learned 1, 2, 3 and 4. But he didn't realize yet that 4 is different than 1, so he thinks that 4 is another way to write 1. Besides that, he is having fun with a little game he created himself: he make numbers (with those four digits) and sum their values. For instance:

    132 = 1 + 3 + 2 = 6
    112314 = 1 + 1 + 2 + 3 + 1 + 1 = 9 (remember that Gustavo thinks that 4 = 1)
    
    After making a lot of numbers in this way, Gustavo now wants to know how much numbers he can create such that their sum is a number n. For instance, for n = 2 he noticed that he can make 5 numbers: 11, 14, 41, 44 and 2 (he knows how to count them up, but he doesn't know how to write five). However, he can't figure it out for n greater than 2. So, he asked you to help him.

    The Input

    Input will consist on an arbitrary number of sets. Each set will consist on an integer n such that 1 <= n <= 1000. You must read until you reach the end of file.

    The Output

    For each number read, you must output another number (on a line alone) stating how much numbers Gustavo can make such that the sum of their digits is equal to the given number.

    Sample Input

    2
    3
    

    Sample Output

    5
    13
    

    题意:Gustavo数数时总是把1和4搞混,他觉得4仅仅是1的第二种写法。给出一个整数n,Gustavo想知道有多少个数的数字之和恰好为n。比如,当n=2时,有5个数:11、14、41、44、2。

    分析:如果 F(n) 表示使用 1。2,3,4 构建的和为 n 的序列总数,则这些序列中,以 1 为開始的序列种数为 F(n - 1)。以2为開始的为 F(n - 2)。以3開始的序列总数为 F(n - 3)、以4開始的序列总数为  F(n - 4),因为 Gustavo 把 4 当作 1,则有 F(n - 4) = F(n - 1),
     故 F(n) = F(n - 1) + F(n - 2) + F(n - 3) + F(n - 4) = 2 * F(n - 1) + F(n - 2) + F(n - 3)。

    边界条件: F(1) = 2, F(2) = 5。 F(3) = 13。
    #include<string>
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    vector<string> v;
    
    string add(string a, string b)
    {
        string s;
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        int i = 0;
        int m, k = 0;
        while(a[i] && b[i])
        {
            m = a[i] - '0' + b[i] - '0' + k;
            k = m / 10;
            s += (m % 10 + '0');
            i++;
        }
        if(i == a.size())
        {
            while(i != b.size())
            {
                m = k + b[i] - '0';
                k = m / 10;
                s += m % 10 + '0';
                i++;
            }
            if(k) s += k + '0';
        }
        else if(i == b.size())
        {
            while(i != a.size())
            {
                m = k + a[i] - '0';
                k = m / 10;
                s += m % 10 + '0';
                i++;
            }
            if(k) s += k + '0';
        }
        reverse(s.begin(), s.end());
        return s;
    }
    
    void solve()
    {
        v.push_back("0");
        v.push_back("2");
        v.push_back("5");
        v.push_back("13");
        string s;
        for(int i = 4; ; i++)
        {
            s = add(v[i-1], v[i-1]);
            s = add(v[i-2], s);
            s = add(v[i-3], s);
            v.push_back(s);
            if(v[i].size() > 1001) break;
        }
    }
    
    int main()
    {
        solve();
        int n;
        int Size = v.size();
        while(cin >> n)
        {
            cout << v[n] << endl;
        }
        return 0;
    }



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    form表单为什么不能提交
    遇到了消息堆积,但是问题不大
    面试题:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?
    Dubbo学习地址
    Dubbo入门到实战2
    Dubbo入门到实战
    Mybatis 的三种执行器
    从源码理解Druid连接池原理
    Getting NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()
    解决问题:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4855393.html
Copyright © 2011-2022 走看看