滑雪课程设计问题Usaco算法

时间:2019-05-31 02:56:33

标签: logic

我正在从usaco解决这个问题。 农夫约翰的农场有N个山丘(1 <= N <= 1,000),每个山峰的整数倍范围为0 ..100。在冬天,由于这些山丘上积雪丰富,FJ定期进行滑雪训练营地。

不幸的是,FJ刚刚发现了一项新税种,明年将对用作滑雪训练营的农场征收新税。但是,在仔细阅读法律后,他发现滑雪营地的正式定义要求其财产上的最高和最低山高之差严格大于17。因此,如果他缩短了最高的山高并增加了质量增加最高矮山丘的高度,只要最高和最低山丘之间的新差异最大为17,FJ就可以避免纳税。

如果将山的高度更改为x单位要花费x ^ 2单位的钱,那么FJ需要支付的最低金额是多少? FJ只能更改一个山的高度一次,因此每个山的总成本是其原始高度与最终高度之差的平方。 FJ只愿意将每个山丘的高度更改为整数。 例如: 5 20 4 1个 24 21 输出:18 FJ保持山高分别为4、20和21。他将质量添加到了1号高度的山丘上,使其达到4号高度(成本= 3 ^ 2 = 9)。他以3 ^ 2 = 9的高度将身高24的山坡缩短到身高21。 所以9 + 9 = 18。

我尝试找到每次迭代所需的最小更改量。例如,在1和24的情况下,我说24-1-17 = 6。所以我将1增加6 // 2即3,并将其减少24。这使我进入4和21(即17)。而且,一个山丘只能更改一次,因此我将其设置为-1来标记为已访问。

elevation=[]
with open("skidesign.in",'r') as file:
    n=int(file.readline())
    for f in file.readlines():
        elevation.append(int(f.strip()))    
sumSquares=0
minimum=min(elevation)
maximum=max(elevation)
minindex=elevation.index(minimum)
maxindex=elevation.index(maximum)
while (maximum-minimum)>17:
 diff=maximum-minimum-17 
    if(diff%2==0):
            first=second=diff//2
    else:
        first=diff//2
        second=diff//2+1
    elevation[minindex]=-1
    elevation[maxindex]=-1
    sumSquares+=first*first 
    sumSquares+=second*second
    minimum=min(i for i in elevation if i>-1)
    maximum=max(i for i in elevation if i>-1)
    minindex=elevation.index(minimum)
    maxindex=elevation.index(maximum)

该代码适用于基本情况。但是对于以下更复杂的情况失败: 50 50 84 22 44 38 0 46 66 22 73 25 92 5 56 13 73 48 32 42 91 3 100 97 8 27 34 73 58 42 80 53 59 55 52 3 30 84 100 31 80 79 11 70 55 64 92 29 77 71 72

预期输出为22946,但我得到22797。

0 个答案:

没有答案