摘水果

Posted 929code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了摘水果相关的知识,希望对你有一定的参考价值。

x坐标轴上分配了水果的位置(升序)和个数
给你一个开始位置和步数,可以选择往左或往右,返回可以摘到的最大水果数

1. 二分查找+前缀和+滑动窗口

枚举先左后右和先右后左两种情况下的左右边界,利用二分和前缀和快速求值

class Solution 
public:
    int maxTotalFruits(vector<vector<int>>& fruits, int startPos, int k) 
        int n = fruits.size();
        vector<int> presum(n + 1);//前缀和
        vector<int> indices(n);//单独用来二分
        for (int i = 0; i < n; i++) 
            presum[i + 1] = presum[i] + fruits[i][1];
            indices[i] = fruits[i][0];
        
        int res = 0;
        for (int x = 0; x <= k / 2; x++) 
            /* 向左走 x 步,再向右走 k - x 步 */
            int y = k - 2 * x;//往右的距离
            int left = startPos - x;//左边界
            int right = startPos + y;//右边界
            int start = lower_bound(indices.begin(), indices.end(), left) - indices.begin();//左闭
            int end = upper_bound(indices.begin(), indices.end(), right) - indices.begin();//右开
            //这里end相当于end的前一个位置,即所能到达右侧最远位置,其前缀和
            res = max(res, presum[end] - presum[start]);
            /* 向右走 x 步,再向左走 k - x 步 */
            y = k - 2 * x;
            left = startPos - y;
            right = startPos + x;
            start = lower_bound(indices.begin(), indices.end(), left) - indices.begin();
            end = upper_bound(indices.begin(), indices.end(), right) - indices.begin();
            res = max(res, presum[end] - presum[start]);
        
        return res;
    
;

正确理解异步分工

背景

一个果园会产出5种水果,ABCDE,每种水果有不同处理方式。
果园每天只采摘一次,每次只采摘一种水果,当天会摘哪一种,会看长势临时决定。

水果种类=事件类型

果农和工人=线程/代码函数

贴纸条=发布消息

看纸条=接收消息

同步方案

果园里只有一个老果农打理,他每天进园采摘一种水果。如果摘到ABC三种水果,他就送到市场上去卖,如果是C水果,在卖的时候还要帮人加工一下。如果摘到D水果,就送隔壁去喂猪,如果是E水果,就带回家榨果汁。

交接

再后来他干不动了,想找个人接班,但是找不到,因为这个人既要会摘水果,还要会卖东西管帐,卖的时候还要会加工,还要会喂猪,还要会榨果汁,一件事可能一天都干不完,在他熟练前水果已经烂在地里了。

异步方案1

老果农不缺钱,只差人手,决定多人分工,工人甲只负责摘果子,放到仓库里,然后在果园外贴个纸条,今天摘了什么果子。工人乙看到有人贴了纸条,就会跑过去看内容,如果是ABC水果,就去仓库里拉出来去市场上卖,如果是C水果,就边卖边加工。如果看到是D水果,就要拉去喂猪,如果是E水果,就什么也不管,留给果农回家榨果汁。

弊病

工人甲很轻松,每天摘下果子,贴张纸条,剩下什么也不用管。工人乙承担了大量的工作,仍然需要一身技能,而且还时不时会看到垃圾信息(摘到了E水果)。

再次交接

随着果园产出果越来越大,水果种类也越来越多,工人乙不胜其烦,最后老果农发现局面和自己退休时一样,也找不到一个合适的全才来接工人乙的工作。

异步方案2

工人甲仍然只负责摘果子,放到仓库里,但是贴纸条的要求变了,如果是ABC水果,贴个红色纸条,工人丙看到红色纸条出现以后就去仓库拉水果去卖。如果是C水果,要再贴张黄色纸条,工人丁看到黄色纸条出现,就会去市场上找工人丙,帮他加工水果。如果是D水果,贴绿色纸条,然后工人戊会拉去喂猪,如果是E水果,什么也不贴,大家没看到纸条,什么也不用做,留给老果农带回家榨果汁。

异步方案2完善

有时候工人丁看到黄色纸条,到了市场上,会发现工人丙还没到,需要等待,于是工人丙承担了黄色纸条的发布工作,每次工人丙看到红条,在出发去市场上之前,在自家门口贴上黄条,这时候工人丁看到了,动身,再也不会发生时间不合拍的问题。

结果

工人甲对贴纸条的不偷懒,让其他工人不再需要跑过来看内容,只要远远看颜色就知道要做什么了。每个收到信息的工人只需要一项技能,维护简单,容易交接。并且再也没有人为了垃圾信息白跑一趟去看纸条

本文由个人 hexo 博客 co2fe.com 迁移
date: 2018-03-28 21:25:01



以上是关于摘水果的主要内容,如果未能解决你的问题,请参考以下文章

正确理解异步分工

HaaS Python + AI 隆重登场 使用 ESP32 + 摄像头 机器视觉实现水果识别

每日一题904. 水果成篮

给茄子疏叶的作用是啥?正确的疏叶方法是怎样的?

.Net刷leetcode

.Net刷leetcode