Lintcode 1753. 写作业

n个人,他们每个人需要独立做m份作业。 第i份作业需要花费cost[i]的时间。由于每个人的空闲时间不同,第i个人有val[i]的时间,这代表他做作业的总时间不会超过val[i]。每个人都按照顺序,从1号作业开始,然后做2号,3号...... 现在,你需要计算出他们最多花了多少的时间。
样例
给定cost=[1,2,3,5],val=[6,10,4],返回15。
第一个人可以完成1号作业,2号作业,3号作业,1+2+3<=6。
第二个人可以完成1号作业,2号作业,3号作业,无法完成4号作业,1+2+3<=10,1+2+3+5>10。
第三个人可以完成1号作业,2号作业,无法完成3号作业,1+2<=4,1+2+3>4。
1+2+3+1+2+3+1+2=15,返回15。
注意事项
1<=n<=100000 1<=m<=100000 1<=val[i]<=100000 1<=cost[i]<=100000

 

这道题目注意点主要在于时间复杂度的优化,看到数据量的规模,使用暴力破解肯定会超时。

(1)使用一个数组来存储cost[i]的前i项和

(2)二分查找

public long doingHomework(int[] cost, int[] val) {
        // Write your code here.
        int[] sums = new int[cost.length];
        int sum = 0;
        for (int i = 0; i < cost.length; i++) {
            sum += cost[i];
            sums[i] = sum;
        }
        long res = 0;
        for (int v : val) {
            long va = search(sums, v);
            if (va != -1) {
                res += va;
            }
        }
        return res;
    }

    private long search(int[] sums, int target) {
        if (target >= sums[sums.length - 1]) {
            return sums[sums.length - 1];
        }
        if (target < sums[0]) {
            return -1;
        }
        int l = 0, r = sums.length - 1;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (sums[mid] <= target && sums[mid + 1] > target) {
                return sums[mid];
            } else if (sums[mid] > target && sums[mid - 1] <= target) {
                return sums[mid - 1];
            } else if (sums[mid] < target) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return -1;
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值