一开始看错题wa了好多发。。。题目要求 1.加水量最少 2.在有多种解的时候p个桶的总水量最小。为了满足条件二,很容易想到从水量最小的桶开始加水。那如何保证加水量最少?可以枚举以 为标准的情况下,最少的加水量,加水量为
,后面的求和可用前缀和数组来表示。
class Solution {
public:
/**
*
* @param n int整型 水桶的个数
* @param q int整型 询问的次数
* @param a int整型vector n个水桶中初始水的体积
* @param p int整型vector 每次询问的值
* @return int整型vector
*/
vector<int> solve(int n, int q, vector<int>& a, vector<int>& p) {
// write code here
int size = a.size();
sort(a.begin(), a.end());
int sum[10005];
int INF = 0x3f3f3f3;
sum[0] = 0;
vector<int> result;
for(auto i: p){
int tmp = INF;
for(int j = 1; j <= size; j++){
sum[j] = sum[j-1] + a[j-1];
}
int all = 0, ans = INF, pos;
for(int j = i; j <= n; j++){
all = a[j - 1] * i - (sum[j] - sum[j - i]);
if(all < ans){
ans = all;
pos = j;
}
}
// 加完水后做个更新
for(int j = pos - 1; j >= pos - i; j--){
a[j] = a[pos - 1];
}
result.push_back(ans);
}
return result;
}
};
京公网安备 11010502036488号