无法在codechef中找到练习题的解决方案

时间:2009-10-29 15:15:48

标签: python algorithm

以下是代码大师的问题:

一组N名贵宾已经在德里紧接着抵达,正在等待运送到Roorkee参加就职典礼的开幕式。作为Cognizance的大赞助商,组织团队认为安排不止一位高官乘坐单一车辆是不合适的。此外,每位高官都提前向组织团队指定了他喜欢的交通方式。因此,组织团队制定了一份清单,列出了每位高官可接受的运输机制。鉴于德里的偏好列表和N个可用车辆列表,您需要指定是否可以按照每个人的偏好满足车辆分配。每个高官占据最多1个运输单位。 输入格式: 第1行:N - 要人数量。 1 <= N <= 100 第2-N + 1行:要人的名字 - 每行1个。 N + 2到2 * N + 1行:车辆名称,每行1个 第N + 2行以上:K - 每个尊严的首选项清单的大小,后跟K空格分隔的可接受运输工具的名称。 K <= N. 注意:没有名称的长度为&gt; 100。

输出格式:

第1行:  是/否。

示例输入:

4

Divye

罗希特夏尔

Akshat

PARTH

蝎子

BMW

福特

雪佛兰

1辆宝马

1福特

2 Scorpio Chevrolet

1福特

示例输出:

没有

问题的链接:http://www.codechef.com/problems/INSOMB6/

这是我写的代码:

#!/usr/bin/python

ceo = []
cars = []
error = True
n = int(raw_input())
for i in range(n):
 ceo.append(raw_input().lower())
for i in range(n):
 cars.append(raw_input().lower())

for i in range(n):
 test = raw_input().lower().split()
 if int(test[0]) is not len(test[1:]):
  error = False
  continue
 if test[0] != '0':
  for i in test[1:]:

   try :
    cars.remove(i)
   except ValueError :
    error = False

if error and  len(cars) is 0 :
 print "Yes"
else : 
 print "No"

它为样本输入提供正确的输出。但它在某处失败了。如果你们能指出这段代码失败的情况,那就太棒了!

2 个答案:

答案 0 :(得分:2)

第一个错误(我怀疑它阻止了你):

if int(test[0]) is not len(test[1:]):

使用is / is not测试不可变项(例如数字)绝对不正确:请改用=!=。您编写的代码可能会意外地作为基于实现的工件在“缓存”小整数的Python版本中工作,但它仍然是错误的;-)。同样适用于len(cars) is 0之后。

使用名为error的变量来表示缺少错误是特殊和混乱的(虽然技术上没有错误的代码; - )。

算法错误是:所有你正在检查的是每辆车都被1个高官所喜欢。这与“存在满足偏好的贵宾的1-1分配”非常不同。例如,如果所有贵宾都喜欢所有汽车,你会说“不”(因为你删除了循环第一段的所有汽车,然后第二次得到一个ValueError,因此将error设置为{{1虽然最明显的答案必须是“是”!所以,从头开始重新思考算法。考虑使用集合或词组,它们可能会让您的生活更轻松(它们不会改变算法,但可能更容易看到/概念化)。

答案 1 :(得分:1)

考虑测试用例:

2
A
B
1
2
2 1 2
1 1

答案是肯定的,因为A人可以使用汽车2,B人将使用汽车1.

我相信你的解决方案会将人A放在车1中,然后无法安置人2。

如果你想要一个提示,这个问题就会减少到是否存在二分图的完美匹配。