#UT633. [USACO6.3.3] 牛车Cowcycles
[USACO6.3.3] 牛车Cowcycles
Cowcycles
在从乡村的原始田野搬到时尚的郊区院子后,休·海夫(Hugh Heifer)在《Playbov》杂志上赚了一大笔钱。为了回到他美好的田园记忆,他希望用自己的力量骑着牛自行车(Cowcycle)回到他曾经工作过的地方(这是一种特别为他精心修剪的蹄子设计的自行车)。
休的体重超过一吨;因此,顺利地加速到传统的牛自行车齿轮设置是有些挑战性的。在一些相距较大的齿轮比之间变化会导致对休的心脏造成负担。
帮助休为他的牛自行车选择 F(1 <= F <= 5)个前齿轮(链轮)和 R(1 <= R <= 10)个后齿轮,以构建他的 F*R 速牛自行车,遵循以下规则:
- 前齿轮的可能大小(齿数)由指定。
- 后齿轮的可能大小(齿数)也由指定。
- 在任何给定的齿轮设置下,齿轮比是前齿轮齿数与后齿轮齿数的商(即前齿轮齿数除以后齿轮齿数)。
- 最大齿轮比必须至少是最小齿轮比的三倍。
- 应最小化连续(即排序后)齿轮比之间差异的方差(variance)。
使用以下公式计算一组差异的均值和方差(xi 在此公式中表示):
1 n
mean = --- SUM xi
n i=1
1 n
variance = --- SUM (xi - mean)²
n i=1
推导并打印出前齿轮和后齿轮的最佳组合,以使方差最小(并且齿轮比跨度至少为 3 倍)。
程序名称:cowcycle
输入格式
第一行:前齿轮和后齿轮的数量 F 和 R。第二行:四个数字:F1,F2(25 <= F1 < F2 <= 80),R1和R2(5 <= R1 < R2 <= 40)。提供的所有前齿轮在 F1 至 F2 之间;所有后齿轮在 R1 至 R2 之间。至少存在一组合法的齿轮组合。
示例输入(文件 cowcycle.in)
2 5
39 62 12 28
输出格式
输出选定的 F 个前齿轮的齿数,从小到大排列,第一行输出(用空格分隔)。第二行输出所选的 R 个后齿轮的齿数,从小到大排列。所有齿轮的齿数当然都是整数。
如果存在多个最佳答案,输出具有最小前齿轮组合的答案(最小的第一齿轮,或第一个齿轮相同时的最小的第二齿轮,等等)。同样,如果所有第一个齿轮都匹配,输出具有最小后齿轮组合的答案(类似于前齿轮集合的规则)。
示例输出(文件 cowcycle.out)
39 53
12 13 15 23 27
注释
这个问题希望你找到“一个最优的齿轮比组合”,使得齿轮比的间隔最为均匀。考虑上面的测试用例:
2 5
39 62 12 28
这指定了从 39 到 62 的两前齿轮;从 12 到 28 的五个后齿轮。程序必须检查所有可能的 62-39+1=24 个前齿轮,以及从 28-12+1=17 的五个后齿轮组合。组合起来,总的可能性为 (24 取 2) 乘以 (17 取 5),即 656,880 种可能性(我认为)。
对于每一个可能性,计算如下:这个例子考虑“第一个”情况:前齿轮为 39 和 40,后齿轮为 12,13,14,15 和 16。
首先,计算所有可能的齿轮比:
39/12 = 3.25000000000000000000
39/13 = 3.00000000000000000000
39/14 = 2.78571428571428571428
39/15 = 2.60000000000000000000
39/16 = 2.43750000000000000000
40/12 = 3.33333333333333333333
40/13 = 3.07692307692307692307
40/14 = 2.85714285714285714285
40/15 = 2.66666666666666666666
40/16 = 2.50000000000000000000
然后,将它们排序:
39/16 = 2.43750000000000000000
40/16 = 2.50000000000000000000
39/15 = 2.60000000000000000000
40/15 = 2.66666666666666666666
39/14 = 2.78571428571428571428
40/14 = 2.85714285714285714285
39/13 = 3.00000000000000000000
40/13 = 3.07692307692307692307
39/12 = 3.25000000000000000000
40/12 = 3.33333333333333333333
然后,计算绝对差值:
2.43750000000000000000 - 2.50000000000000000000 = 0.06250000000000000000
2.50000000000000000000 - 2.60000000000000000000 = 0.10000000000000000000
2.60000000000000000000 - 2.66666666666666666666 = 0.06666666666666666666
2.66666666666666666666 - 2.78571428571428571428 = 0.11904761904761904762
2.78571428571428571428 - 2.85714285714285714285 = 0.07142857142857142857
2.85714285714285714285 - 3.00000000000000000000 = 0.14285714285714285715
3.00000000000000000000 - 3.07692307692307692307 = 0.07692307692307692307
3.07692307692307692307 - 3.25000000000000000000 = 0.17307692307692307693
3.25000000000000000000 - 3.33333333333333333333 = 0.08333333333333333333
然后,计算右侧数字集的均值和方差。均值是(我认为):0.0995370370370370370366666。方差大约是0.00129798488416722。
当然,这组齿轮是无效的,因为它没有具有 3 倍跨度的条件。
找到最小化方差且具有 3 倍或更多跨度的齿轮组。