zoukankan      html  css  js  c++  java
  • google code jam exercise——All Your Base

    连续碰到几道题搞不定,想找一道简单一点的,来增加一点成就感。于是看了这道题,第一道题,虽然是C轮的,应该不会太难吧?但看完题就知道自己错了,为什么连题都看不懂呢?

    无奈,求助答案吧。

    答案好简单,连Python代码都给了。还是简单分析一下吧。

    先来解释题目意思,题目给出一个字符串,包含a-z0-9,表示一个数字,这个数字的基数base可以是任意的,要求选一个基数,使字符串表示的数最小,并且第一位不为0。

    怎样可以使基数最小呢?base=10,即十进制,有0-9种表示0-9,也可以用a-j表示0-9,反正就是要10个不同的字符。那么字符串的基数最小就可以是字符串中不同字符的个数。而且要使表示的数最小,那么高位上的字符表示的数越小越好了。 这样,第一个字符字符表示1,第二个字符如果不一样,就表示2,依此类推。最后将字符串转化为十进制数输出就可以了。

    代码如下,

    #!/usr/bin/python
    #encoding:UTF-8
    #Filename:Base.py
    
    import sys
    
    inname = "input.txt"
    outname = "output.txt"
    if len(sys.argv)>1:
        inname = sys.argv[1]
        outname = inname.rstrip(".in")
        outname = outname + ".out"
    fin = open(inname,"r")
    fout = open(outname,"w")
    
    sys.stdin = fin
    sys.stdout = fout
    
    N = int(sys.stdin.readline().strip())
    for qw in range(1, N+1):
        print 'Case #%d:' % qw,
        num = sys.stdin.readline().strip()
        values = {num[0]: 1}
        for c in num:
            if c not in values:
                sz = len(values)
                if sz == 1:
                    values[c] = 0
                else:
                    values[c] = sz
        result = 0
        base = max(len(values), 2)
        for c in num:
            result *= base
            result += values[c]
        print result
    
    fin.close()
    fout.close()

    因为是content analysis上的代码,必然small和large case测试都通过了。

  • 相关阅读:
    poj3277 City Horizon
    60.左值右值以及类型判断
    59.C++与正则表达式
    57.C++处理转义字符
    56.lambda表达式与绑定以及伪函数和绑定
    55.函数模板指针匹配(模板自动匹配*多的)
    54.函数模板默认参数
    53.伪函数与函数绑定器
    52.模板的重载
    51.模板与引用
  • 原文地址:https://www.cnblogs.com/Frandy/p/google_code_jam_all_your_base_python.html
Copyright © 2011-2022 走看看