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

题目

分析(按照y总思路)

首先先将题目进行转化,因为题目要求:在吃完 所有 第 i - 1 类糖果之前,不能 吃任何一颗第 i 类糖果。所以我们把已有的糖果种类糖果数看成一个线性数轴,如下:

 

 只有数轴左边糖果吃完,才可以吃右边的糖果。接下来把能不能在给定的天数吃到某类的糖果这一问题转换为能不能在给定的天数吃到编号为X的糖果。就是从区间问题降到某个点的问题。

 

 查看第d天能够吃到的糖果编号和第t种糖果的编号这两个区间是否有交集。求解第 t 种糖果的编号区间就是 求解前缀和问题。

代码

 1 typedef long long LL;
 2 class Solution {
 3 public:
 4     //判断区间有没有交点
 5     bool check(LL a,LL b,LL c,LL d){  //[a,b][c,d]
 6         if(b < c || d < a ) return false;
 7         return true;
 8     }
 9     vector<bool> canEat(vector<int>& w, vector<vector<int>>& queries) {
10         int n = w.size();
11        vector<LL>s(n+1);//糖果种类数量的前缀和数组
12        for(int i = 1;i <= n;i++) s[i] = s[i-1] + w[i-1];  //从1开始,w加偏移量-1
13        vector<bool>res;
14        for(auto& q : queries){
15            int t = q[0], d = q[1],c = q[2];
16            res.push_back(check(d+1,LL(d+1)*c,s[t]+1,s[t+1]));
17        }
18        return res;
19     }
20 };

数据范围10的5次方,前缀和数组可能会爆int

 

posted @ 2021-01-31 17:53  Uitachi  阅读(154)  评论(0编辑  收藏  举报