思路:贪心+枚举
具体思路:对于任意一个水桶来看,要么升级水桶要么蓄水,如果蓄水之后再升级水桶之后可以满足,那么先升级水桶再蓄水一定满足,因为倒的水更多了,水缸更会倒满,因此我们可以先升级水桶,最后再蓄水。
细节:i枚举蓄水次数,取值范围是1->max(水缸容量),则满足i的最小水桶容量为 ceil(水缸大小/i) ,需要升级的次数为 ceil(水缸大小/i)-水桶容量,所有的水缸加起来即可所有的升级次数,加i即为总的次数,ans取i循环中的最小值即可。
class Solution {
public:
int storeWater(vector<int>& bucket, vector<int>& vat) {
int _max = *max_element(vat.begin(), vat.end());
if (!_max) return 0; //
int n = bucket.size(), ans = INT_MAX;
for (int i = 1; i <= _max; ++i) {
int tmp = i;
for (int j = 0; j < n; ++j) {
int rise = ceil(double(vat[j]) / i) - bucket[j];
tmp += (rise > 0 ? rise : 0);
}
ans = min(ans, tmp);
}
return ans;
}
};
细节
1:全是0时特殊讨论。
2:有可能满足的最小容量小于本身的容量,此时为负值,应该+0