LCP 33. 蓄水

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;
    }

不知道为什么遍历双百了...可能提交的人太少了...

 (如有错误感谢指出!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值