1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?

思路:

这个题终于能独立想出思路了,就是计算不同类型糖果吃到之前需要吃多少前面的类型的糖果,就是计算前缀和。
举个例子,74538,前缀和为0 7 11 16 19 27,我们这里27是总的数量,是解决边界条件用的。
我们得到前缀和后就可以开始用queries的数据了,我们这里取出favoritetype,并加1,取出favoriteday+1,取出dailycap。为什么type要加1,因为我们判断能否吃到需要满足
pre[type-1]<daycap<pre[type],所以加1了,也可以不再取出来的时候加一,满足这个意思就行。day加1是因为我们的day是从第0天开始,所以例如2,就已经是第3天了。
那么目的也就明显了 我们只要pa判断在每天吃的数量为1到dailycap这个范围下,满不满足
pre[type-1]<day
cap<pre[type]即可。

这里如下可能,每天吃1颗小于pre[type-1],吃cap颗大于pre[type-1]小于pre[type]
。每天吃一颗大于大于pre[type-1]小于pre[type]。吃一颗和吃cap颗都大于pre[type-1]小于pre[type]。吃一颗小于pre[type-1],吃cap颗大于pre[type]

上述可以统一为day*cap>pre[type],day<pre[type-1].

代码:

class Solution {
public:
    vector<bool> canEat(vector<int>& candiesCount, vector<vector<int>>& queries) {
        int n1 = candiesCount.size(), n2 = queries.size();
        vector<bool> res(n2,false);
        vector<long long> pre(n1+1,0);
        for(int i=1;i<n1+1;++i){
            pre[i] = pre[i-1]+candiesCount[i-1];
        }
        for(int i=0;i<n2;++i){
            int type = queries[i][0]+1;
            int day = queries[i][1]+1;
            int cap = queries[i][2];
            long long right = pre[type];
            long long left = pre[type-1]/cap;
            res[i] = (day<=right&&day>left);
        }
        return res;

    }
};
posted @ 2021-06-01 15:36  Mrsdwang  阅读(37)  评论(0编辑  收藏  举报