算法学习(七)

1.Bulls and Cows

说明:这是两个人的游戏,通常是用纸和笔进行的。现代版也被称为“策划者”。

第一个玩家,爱丽丝,选择一个四位数的密码(1492),所有的数字都不一样。

第二个玩家,芭芭拉,尝试猜测个密码。她可以提供任何4位数的组合(不需要重复)——而且每次尝试,爱丽丝都应该给出一个提示。

这个提示由两个值组成:

第一个数告诉我们正确猜出了多少位数字,并在正确的位置上;

第二种方法是正确地猜出有多少位数字,但在错误的位置。

例如,如果这个秘密值是1492,芭芭拉的猜测是2013,那么爱丽丝应该用0-2来提示。

如果猜测是1865,那么提示将是1-0。

这个游戏也可以用4个字母的单词来玩,但在这种情况下,它可能需要语言的知识。

问题陈述:你的目标是写一个程序来计算这些值,并由猜测值返回提示。

例子:

input data:
1492 5
2013 1865 1234 4321 7491

answer:
0-2 1-0 1-2 0-3 2-1

Input data 将包含第一行的秘密值和猜测值的数量。

第二行包含指定数量的猜测。

Answer 答案应该包含这些猜测的提示,它们应该以x-y格式给出,并与空格分隔。

Test data:

0197 11
1796 0869 2140 9210 9624 6417 7208 4867 8902 8971 2164

代码如下:

 1 data1 = input().split()
 2 correct_num = list(data1[0])  # 秘密数值,转化为列表形式
 3 guess_nums = int(data1[1])   # 猜测值数量
 4 data2 = input().split()
 5 
 6 for n in data2:
 7     guess = list(n)
 8     first = 0
 9     two = 0
10     for m in range(4):
11         if guess[m] == correct_num[m]:  # 比较有多少猜对的数,在正确的位置上
12             first += 1
13         elif guess[m] in correct_num:   # 有多少位猜对的数
14             two += 1
15     print('{}-{}'.format(first, two), end=' ')
16 
17 输出: 1-2 1-1 1-1 0-3 0-1 1-1 0-2 1-0 0-2 0-3 1-0 

 

2.Two Printers(两个打印机的问题)

说明:现在有了一个商业协议——需要打印一份包含N页的文件。

有两台打印机,但看起来打印机的工作速度是不同的。一个在X秒内打印完成一页,另一个在Y秒内完成一页。

现在的问题是求出可以花最少的时间用两台打印机打印整个文档。

例子:

input data:
2
1 1 5
3 5 4

answer:
3 9

Input data 第一行中包含测试用例数。

然后,测试用例每一个都在单独的行中。

每个测试用例包含三个整数值——X Y N,其中N不会超过10亿。

Answer 应该包含每个测试用例的打印时间,由空格分隔。

分析:应该把打印一页的不同时间,转化为相同时间打印多少页

输入数据:

16
397 198 799028
5 13 64495601
11 2 69516005
338 900 972621
67 62 7644114
886 73 974401
124 9 6394340
20 33 15282074
1 1 618615655
82 56 9300869
1248 427 524338
1005 2674 98192
121 66 6071269
786 486 601058
1283455 473995 269
97484 57402 6470

代码如下:

 1 test_cases = int(input())  # 测试用例数量
 2 for i in range(test_cases):
 3     testcase = input().split()
 4     X = int(testcase[0])
 5     Y = int(testcase[1])
 6     N = int(testcase[2])
 7     time = N / (1 / X + 1 / Y)   # 转化为1秒钟可以打印多少x和y,求出大概时间
 8     numX = (time // X) + 1    # 讨论打印最后一页的问题,X多打一页
 9     numY = (time // Y) + 1    # Y多打一页
10     Ans = round(min(numX*X, numY*Y))  # 取X,Y多打一个时,它们两个值的最小值,就是一起打印所需的最小时间
11     print(Ans, end=' ')
12 
13 输出:105560334 232900785 117642472 238991400 246152338 65716717 53654769 190305080 309307828 309489812 166816517 71725845 259278921 180504774 93377015 233766632

 

posted @ 2017-08-18 18:59  ZT1994  阅读(312)  评论(0编辑  收藏  举报