一开始看错题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; } };