有n个水桶,第i个水桶里面水的体积为Ai,你能够用1秒时间向一个桶里添加1体积的水。数组
有q次询问,每次询问一个整数pi,你须要求出使其中pi个桶中水的体积相同所花费的最少时间。spa
对于一次询问若是有多种方案,则采用使最终pi个桶中水的体积最小的方案。3d
输入:4,3,[1,2,3,4],[2,2,4]code
输出:[1,0,5]blog
说明:排序
第一次:花费一秒变为 2 2 3 4ip
第二次:已经存在两个水的体积同样的桶io
第三次:花费五秒从2 2 3 4变为4 4 4 4class
先来看一下题干,让咱们求使最终pi个桶中水的体积最小的方案,也就是说每次向水较少的桶中注水,所以考虑先给n个水桶按含水体积从小到大排个序。要求使其中pi个桶中水的体积相同,对这句话的理解是在排好序的数组中连续pi个数相同。解题的总思路是:每次询问时枚举全部可能的状况,找到花费最小的位置存入res[]中,肯定最佳方案后再向桶里注水(修改桶中水的值,即修改数组值)。变量
下面结合例子具体来讲一说一次询问时的过程:
Tips:
public class Solution { /** * * @param n int整型 水桶的个数 * @param q int整型 询问的次数 * @param a int整型一维数组 n个水桶中初始水的体积 * @param p int整型一维数组 每次询问的值 * @return int整型一维数组 */ public int[] solve (int n, int q, int[] a, int[] p) { int[] res = new int[q]; Arrays.sort(a); int equal = 0; for(int i = 0; i < q; i++) { if(p[i] <= equal) { res[i] = 0; continue; } int sum = 0; for(int j = 0; j < p[i]; j++) { sum += a[j]; } int min = a[p[i] - 1] * p[i] - sum, min_begin = 0;; for(int begin = 1; begin <= n - p[i]; begin++) { sum = sum - a[begin - 1] + a[begin + p[i] - 1]; if(a[begin + p[i] - 1] * p[i] - sum < min) { min = a[begin + p[i] - 1] * p[i] - sum; min_begin = begin; } } res[i] = min; equal = Math.max(equal, p[i]); for(int j = min_begin; j < min_begin + p[i]; j++) { a[j] = a[min_begin + p[i] - 1]; } } return res; } }