我的代码堵塞练习的解决方案或输出方法有啥不正确的地方?

Posted

技术标签:

【中文标题】我的代码堵塞练习的解决方案或输出方法有啥不正确的地方?【英文标题】:what is incorrect about my solution or my output method for codejam exercise?我的代码堵塞练习的解决方案或输出方法有什么不正确的地方? 【发布时间】:2018-08-05 00:08:22 【问题描述】:

我参加了 google code jam 比赛的 kickstart 并陷入了名为 Gbus count 的问题 1A 我的代码正在通过问题中提供的示例测试用例,但是当我通过将小输入输出到文件来提交小输入时,它给了我一个错误,不正确的响应。

问题链接 - https://code.google.com/codejam/contest/4374486/dashboard#s=p0

t=int(input())    #no. of test cases 
for test in range(t):
    if test==0:
        n=int(input())
    else:
        input()     #to cover up the blank line after each test case
        n=int(input())
    l=list(map(int,input().split()))

    buses=      # the route of each bus will be stored in this dictionary
    i=1

    for d in l:       # this loop is used to store the route of each bus in the buses dictionary
        if i not in buses:
            buses[i]=[d]
        elif len(buses[i])<2:
            buses[i].append(d)
        else:
            i=i+1
            buses[i]=[d]

    p=int(input())
    cities=
             #this dictionary will contain the cities which need to be monitored
    for _ in range(p):     #first each city is initialized to zero
        cities[int(input())]=0

    for city in cities:       #Monitor all buses in each city if it falls in the route range than increment the city
        for bus in buses:
            if buses[bus][0]<=city<=buses[bus][1]:
                cities[city]+=1
    result=[]

    for city in cities:      #store all the cities in a list
        result.append(cities[city])

    print("Case #: ".format(test+1, ' '.join(map(str,result))))

我的逻辑:

首先,我将所有测试用例放入变量 t 中,并为每个测试用例输入编号。公共汽车的数量和列表 l 中所有公共汽车的输入路线。然后我创建了一个名为 buss 的字典,并将该列表分为 n 个列表,每个总线 nume=beres 在字典中从 1 到 n 的每个列表。

然后我将所有要监控的城市输入到另一个字典中,名字为citys,并将每个要监控的城市的值初始化为0。

最后,我计算了数字。通过检查每个城市的公共汽车是否落在每辆公共汽车的路线范围内,如果是,我将相应城市的值增加 1,然后将字典的所有值存储在一个列表中,并为每个测试输出它案例。

输出方法:

我使用这一行在我的工作目录中使用 cmd 执行我的代码

python gbus_count.py < A-small-attempt3.in > output.out

我的代码适用于提供的示例测试用例,因此我的逻辑可能没有缺陷。我认为我的输出方法可能有错误。

【问题讨论】:

在电脑上安装Idle python,只需按f5即可运行程序。如果您的程序不正确,那么它会显示错误和发生错误的行。您只需要知道错误检测 由于这是一个练习练习,如果您有兴趣,我可以将我的解决方案添加到下面的答案中。 (我最初没有添加它,因为它会破坏你的想法)。 @Anubis 是的,我当然希望看到解决这个问题的更好方法 【参考方案1】:

我发现您的代码中有两个问题。

    Python 标准字典未排序!因此,cities 字典将不会按照您输入的顺序包含元素(键)。 从Python 3.1 开始,您可以为此使用OrderedDict 如果同一个城市重复两次(或多次),最终结果中将只有一个条目,因为字典不能保存重复的键。

我看到您的设计有流程。此外,我认为你可以很容易地做到这一点,而不会使事情变得太复杂。


注意: 从 Python 3.6 开始,标准字典默认保持插入顺序。


更新

根据要求,以下是我解决问题的尝试。

请注意,这可能不是最佳解决方案!当然,这不是最易读的解决方案。这只是我的解决方案。

for case in range(1, int(input())+1):
    if case > 1:
        input('\n') # consume and print newline
    print("Case #:".format(case), end='')
    bus_count = int(input())
    busline = list(map(int, input().strip().split(" ")))
    for _ in range(int(input())):
        city = int(input())
        matches = sum([1 for bid in range(bus_count) if busline[2*bid] <= city <= busline[2*bid+1]])
        print(" ".format(matches), end='')

【讨论】:

感谢指出错误,我还有一个疑问,我的输出方法是否正确? 请准确地说,你是什么意思? python gbus_count.py &lt; A-small-attempt3.in &gt; output.out这个命令输出代码是否正确 是的,没错。更多详情请参考google codejam quick start guide【参考方案2】:

您也可以查看此解决方案:

def Gbus_Count():
    T = int(input())
    for i in range(T):
        if i == 0:
            N = int(input())
        else:
            input()
            N = int(input())
        A = list(map(int, input().split()))
        P = int(input())
        C = list()
        D = dict()
        for k in range(P):
            C.append(int(input()))
        for m in range(P):
            for n in range(N):
                if A[2*n]<=C[m]<=A[2*n+1]:
                    if C[m] not in D:
                        D[C[m]] = 1
                    else:
                        D[C[m]] += 1
        print("Case #: ".format(i+1, ' '.join(str(x) for x in D.values())))
Gbus_Count()

【讨论】:

以上是关于我的代码堵塞练习的解决方案或输出方法有啥不正确的地方?的主要内容,如果未能解决你的问题,请参考以下文章

union 和 join 和有啥不一样?

union 和 join 和有啥不一样?

两个html文本文件,想对比这两个文件有啥不一样的地方。

我对 getline+strings 有啥不了解的地方?

SSP和SPI接口有啥不一样?

nx 和 Lerna 和有啥不一样? (monorepos)