普通解法:
无
最优解法:
将n个数从小到大排序,然后求前缀和(记为d)。
使p个桶中的水一样且花费最小在排序后的数组中即为使连续p个桶中的水一样,花费为,枚举所有位置,找到花费最小的位置,然后将桶中的水修改。
时间复杂度:
空间复杂度:
class Solution {
public:
/**
*
* @param n int整型 水桶的个数
* @param q int整型 询问的次数
* @param a int整型vector n个水桶中初始水的体积
* @param p int整型vector 每次询问的值
* @return int整型vector
*/
int c[100010];
int d[100010];
vector<int> solve(int n, int q, vector<int> &a, vector<int> &p) {
// write code here
sort(a.begin(), a.end());
d[0] = 0;
for (int i = 0; i < n; i++) {
c[i + 1] = a[i];
}
int cnt = 0;
vector<int> ret;
ret.clear();
int x;
while (q--) {
x = p[cnt++];
for (int i = 1; i <= n; i++) {
d[i] = d[i - 1] + c[i];
}
int pos, ans = 0x3f3f3f3f, sum;
for (int i = x; i <= n; i++) {
sum = c[i] * x - (d[i] - d[i - x]);
if (sum < ans) {
ans = min(sum, ans);
pos = i;
}
}
for (int i = pos - 1; i > pos - x; i--) {
c[i] = c[pos];
}
ret.emplace_back(ans);
}
return ret;
}
}; 


京公网安备 11010502036488号