给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。小扣有以下两种操作:升级水桶:选择任意一个水桶,使其容量增加为 bucket[i]+1
蓄水:将全部水桶接满水,倒入各自对应的水缸
每个水缸对应最低蓄水量记作 vat[i],返回小扣至少需要多少次操作可以完成所有水缸蓄水要求。注意:实际蓄水量 达到或超过 最低蓄水量,即完成蓄水要求。
示例 1:
输入:bucket = [1,3], vat = [6,8]
输出:4
解释:
第 1 次操作升级 bucket[0];
第 2 ~ 4 次操作均选择蓄水,即可完成蓄水要求。
思路:要知道总次数,就要知道升级和倒水次数,升级次数不同桶不一样,但倒水次数肯定一样,而且通过倒水次数可以得到升级次数,所以遍历枚举倒水次数即可。
#include<stdio.h>
#include<malloc.h>
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
int storeWater(int* bucket, int bucketSize, int* vat, int vatSize) {
int maxk = 0;
for (int i = 0; i < vatSize; i++)
maxk = max(maxk, vat[i]);//倒水次数一定不会大于全部水缸的最大蓄水量。
if (maxk == 0) return 0;
int res = _CRT_INT_MAX;//设置为最大值,方便下面比较
for (int k = 1; k <= maxk; k++)
{
int t = k;
for (int i = 0; i < bucketSize; i++)//遍历得每个桶的升级次数
{
t += max(0, (vat[i] + k - 1) / k - bucket[i]);//向上取整,数学方法
}
res = min(res, t);
}
return res;
}
int main() {
int n;//水桶和水罐的数量
printf("水桶和水罐的数量:\n");
scanf("%d", &n);
int* bucket = (int*)malloc(sizeof(int)*n);
int* vat = (int*)malloc(sizeof(int) * n);
int bucketSize= sizeof(bucket) / sizeof(int);
int vatSize = sizeof(vat) / sizeof(int);
printf("请输入%d个水桶的容量:\n",n);
for (int i = 0; i < n; i++)
scanf("%d", &bucket[i]);
printf("请输入%d个水罐的容量:\n",n);
for (int i = 0; i < n; i++)
scanf("%d", &vat[i]);
printf("%d",storeWater(bucket, bucketSize, vat, vatSize));
return 0;
}