#3801. 啤酒厂选址(C++二级)

啤酒厂选址(C++二级)

题目描述

海上有一个岛,在环海边上建有一条环岛高速公路,沿着公路有 n(5<n<10000)个居民点,假设每个居民点有一个编号,从 0 开始,按顺时针依次从小到大(即 0,1,…,n−1)编号。在岛上啤酒很受青睐。某啤酒企业计划在岛上投资建一个啤酒厂,并根据啤酒需求每天向居住点送啤酒。已知两个相邻的居民点的距离以及每个居住点每天的啤酒需求量(假设每个居住点每天不超过 2000 桶)。假定每单位长度的路程送一桶啤酒需要的费用恒定(为单位费用)。请问,选择哪一个居民点建啤酒厂,才能使每天送啤酒的费用最小(空车不计费用)。

输入

第一行:为居民点数目 n 后面为 n 行,每行为一个居民点的啤酒需求量以及按顺时针离下一个居民点的距离(均为整数,空格间隔),从编号为 0 的开始,按单增顺次给出。

注意:后面第 n 行对应于居民点(n−1) 的啤酒需求量以及到编号为 0 的居民点距离。

输出

啤酒厂所在的居民点编号以及每天的运输费用,其间以逗号间隔。

样例输入


6
500 10
300 30
350 25
400 60
700 28
200 35

样例输出

0,94100

解析

此题考查多重循环,累加求和,前缀和求区间和,时间复杂度为O(n^2),先利用前缀和计算出各点到零点的距离(方便后边O(1)计算任意两点间距离),然后穷举n个点为啤酒厂地址,循环除建厂点外的其他点的运输花费,求出花费的最小值,即为答案。

继续探讨,如果每换一个点建厂,计算花费的变化量,则可以将时间复杂度降低为O(n),不过此题为第三题,O(n^2) 的时间复杂度为10的8次方,是可以通过的。

Limitation

1s, 1024KiB for each test case.