有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; } }