算法竞赛第五章例题分析:

例题5-1:Uva10474,非常简单的题目,但是我尝试用python来读取控制台的输入发现并不方便,比如要按照空格分开读取就会很麻烦。。。其实真正的核心代码就5行左右…

def Find_Marble():
    def getdata():
        data = input()
        x,y = data.split()
        return int(x),int(y)
    def getarray(a):
        marble = input()
        marble = marble.split()
        for i,k in enumerate(marble):
            a[i] = int(k) 
    case = 1
    while(True):
        try:
            n,q = getdata()#获取输入
        except:
            break       
        a = [-1]*(n+1)
        getarray(a)
        a.sort()
        print('CASE# %d:'%case)
        case += 1
        for i in range(q):
            x = int(input())
            if x in a:print('%d found at %d'%(x,a.index(x)))
            else:print('%d not found'%x)
Find_Marble()

例题5-2:这个题如果按照书上的方法并不难,而且用python写代码会很简单,但是书上的方法有一个不好的地方在于它不断的进行push,resize非常的耗时.仔细思考一下,完全可以避开这些操作,方法就是用一个数组来描述每一个木块和相邻木块的关系,比如p[i]代表木块i的上方是木块p[i],block[i]代表第i个位置是哪个木块.(-1代表无木块).

当然这样从编码角度上来说就相对复杂了一点了,具体编码思路有这几点值得说明:

[0]:对于输入的四种指令,我们处理它们的共同部分而不是分成四种情况去处理.

[1]:对于pile函数,我们必须要寻找a的具体位置,然后将a下方的木块k的p[k]置为-1,如果没有下方木块就跳过这个地方,然后还要注意将block[a]也置为-1.(不管a在不在最下面这样写都不会错)

[2]:对于clear函数我们就没有必要使用findblock函数了,因为我们只是需要将a上方的木块归位,而不需要知道a具体在什么地方,这相对于书上的办法就少了一遍查找a位置的过程.效率大大提高.

def Blocks(n):
    block = [i for i in range(n)]
    p = [-1]*n
    def findblock(a):
        Final = -1
        #首先要找到现在a的位置
        for each in block:
            if(each==a):
                block[a] = -1;return
            elif(each!=-1):
                k = each
                while(p[k]!=-1):
                    if(p[k]==a):Final = k;break
                    k = p[k]
        block[a] = -1
        p[Final] = -1
    def clear(a):
        if(block[a]==-1):return
        while(p[a]!=-1):#遍历a上方的木块
            t = p[a]
            p[a] = -1#迭代到上方的
            block[t] = t#进行归位
            a = t
    def pile(a,b):
        if(a==2):print(p)
        findblock(a)
        if(a==2):print(p)
        while(p[b]!=-1):
            b = p[b]
        p[b] = a
        print(block,p)
    def printblock():
        for each in block:
            if(each!=-1):
                k = each
                while(True):
                    print(k,end = ' ')
                    if(p[k]==-1):print('');break
                    k = p[k]
            else:print('NULL')
    while(True):
                cmd = input().split()
        if(cmd == 'quit'):break
        a,b = int(cmd[1]),int(cmd[3])
        if(a==b):continue
        if(cmd[0]=='move'):clear(a)#先归位
        if(cmd[2]=='onto'):clear(b)
        pile(a,b)
    printblock()
Blocks(10)

例题5-3:输入的文本,找出所有不同的单词,按从小到大输出:

这个题目也没有什么技巧,只是为了展示一下set的用法,注意python里面的set并不能自动排序,所以必须要用sort,但是sort又只有list有,所以还要转换成list。

def Andy():
    while(True):
        x = input()
        if(x==''):return
        s = [each if each.isalpha() else ' ' for each in x]
        s = ''.join(s)
        s = set(s.split())
        s = list(s)
        s.sort()
        print(s)
        for each in s:print(each)
Andy()

你可能感兴趣的:(算法竞赛第五章例题分析:)