LCP 33. 蓄水
开始的思路:
public int StoreWater(int[] bucket, int[] vat)
{
int res = 0;
double temp = 10001;
int minStoreWaterNum = 10001;
int tempA = 0;
int tempB = 0;
for(int i = 0; i < vat.Length; i++){
tempA += bucket[i];
tempB += vat[i];
}
if(tempA == 0){
res += bucket.Length;
for(int i = 0; i < bucket.Length; i++){
bucket[i] = 1;
}
}
if(tempB == 0){
return 0;
}
// 求出最少蓄水次数
for (int i = 0; i < vat.Length; i++)
{
if(bucket[i] != 0 && vat[i] != 0){
temp = (double)vat[i] / bucket[i];
if (Math.Ceiling(temp) < minStoreWaterNum && Math.Ceiling(temp) != 0 && Math.Ceiling(temp) != 1)
{
minStoreWaterNum = (int)Math.Ceiling(temp);
}
}
}
res += minStoreWaterNum;
// 求出最少升级数
for (int i = 0; i < vat.Length; i++)
{
if(vat[i] != 0){
temp = (double)vat[i] / minStoreWaterNum;
if(Math.Ceiling(temp) > bucket[i]){
res += (int)(Math.Ceiling(temp) - bucket[i]);
}
}
}
return res;
}
刚开始想的很理所当然,还以为不用遍历了。以为找到最小蓄水次数再求对应的升级次数就行了。也不知道咋想的,根本没逻辑,而且还踩了很多坑。
public int StoreWater(int[] bucket, int[] vat)
{
// 需求量全为零的特殊情况
int tempB = 0;
for(int i = 0; i < vat.Length; i++){
tempB += vat[i];
}
if(tempB == 0){
return 0;
}
int minOpe = 2147483647;
// 遍历蓄水次数
for (int i = 1; i <= 10000; i++)
{
// i为当前遍历的蓄水次数
int temp = i;
// 在当前蓄水次数条件下求出升级数
for (int j = 0; j < bucket.Length; j++)
{
// 用Ceiling()向上取整的时候要注意转double
double ceiling = (double)vat[j] / i;
int storeWaterNum = (int)Math.Ceiling(ceiling);
// 升级次数 = 最低蓄水量 / 蓄水次数 - 水桶容量
if (vat[j] != 0 && storeWaterNum > bucket[j])
{
temp += (storeWaterNum - bucket[j]);
}
}
if (temp < minOpe)
{
minOpe = temp;
}
}
return minOpe;
}
不知道为什么遍历双百了...可能提交的人太少了...
(如有错误感谢指出!)