健身计划评估

题目描述

题目描述:
你的好友是一位健身爱好者。前段日子,他给自己制定了一份健身计划。现在想请你帮他评估一下这份计划是否合理。

他会有一份计划消耗的卡路里表,其中 calories[i] 给出了你的这位好友在第 i 天需要消耗的卡路里总量。

为了更好地评估这份计划,对于卡路里表中的每一天,你都需要计算他 「这一天以及之后的连续几天」 (共 k 天)内消耗的总卡路里 T:

如果 T < lower,那么这份计划相对糟糕,并失去 1 分;
如果 T > upper,那么这份计划相对优秀,并获得 1 分;
否则,这份计划普普通通,分值不做变动。
请返回统计完所有 calories.length 天后得到的总分作为评估结果。

注意:总分可能是负数。

示例 1:

输入:calories = [1,2,3,4,5], k = 1, lower = 3, upper = 3
输出:0
解释:calories[0], calories[1] < lower 而 calories[3], calories[4] > upper, 总分 = 0.

示例 2:

输入:calories = [3,2], k = 2, lower = 0, upper = 1
输出:1
解释:calories[0] + calories[1] > upper, 总分 = 1.

示例 3:

输入:calories = [6,5,0,0], k = 2, lower = 1, upper = 5
输出:0
解释:calories[0] + calories[1] > upper, calories[2] + calories[3] < lower, 总分 = 0.

提示:

1 <= k <= calories.length <= 10^5
0 <= calories[i] <= 20000
0 <= lower <= upper

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diet-plan-performance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

这是道简单题,上周周赛第二个,不过这道题是个典型的滑动窗口题,和上次组合数组中的所有的1很相似,所以拿来学习下滑动窗口的写法套路也挺好的。

题目要求很简单,k个一组作为一个窗口。
我们只需要取数组中前k个数作为第一个窗口,计算总和,之后遍历数组,遍历的同时计算积分。
每次滑动就是删掉窗口中的第一个数,同时在窗口末尾添加新的值,一直滑到数组末尾即可

具体代码

class Solution {
public:
    int dietPlanPerformance(vector<int>& calories, int k, int lower, int upper) {
        int res = 0;
        int s = 0;
        for(int i = 0; i < k - 1; i++) {
            s += calories[i];
        }
        for(int i = k - 1; i < calories.size(); i++) {
            s += calories[i];
            if(s < lower) {
                res--;
            }
            if(s > upper) {
                res++;
            }
            s -= calories[i - k + 1];
        }
        return res;
    }
};

最近做到一个简单的笔试题,求滑动窗口的最大值,写法和上面类似,就是向右滑动时依次记录最大值,我在下面贴下代码

#include<bits/stdc++.h>
using namespace std;
int a[10000];
int main() {
    int n, k;
    scanf("%d %d", &n, &k);
    for(int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    int maxm = 0;
    for(int i = 0; i < k - 1; i++) {
        maxm += a[i];
    } 
    int res = -100;
    for(int i = k - 1; i < n; i++) {
        maxm += a[i];
        res = max(res, maxm);
        maxm -= a[i - k + 1];
    }
    printf("%d\n", res);
    return 0;
}

题目描述

  • 质数排列

请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。

让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。

由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。

示例 1:

输入:n = 5
输出:12
解释:举个例子,[1,2,5,4,3] 是一个有效的排列,但 [5,2,3,4,1] 不是,因为在第二种情况里质数 5 被错误地放在索引为 1 的位置上。
示例 2:

输入:n = 100
输出:682289015

提示:

1 <= n <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/prime-arrangements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:要求质数都得放在质数索引上
答案就是:质数个数的全排列 * 非质数个数的全排列(注意取模)
其实就是质数个数的阶乘 * 非质数个数的阶乘

class Solution {
public:
    bool isprime(int n){
    if(n<=1) return false;
    for(int i=2;i*i<=n;i++){
        if(n%i==0) return false;
    }
    return true;
    }
    long long fac(int n) {
        long long res = 1;
        int i = 1;
        while(i <= n) {
            res = i*res%1000000007;
            i++;
        }
        return res % 1000000007;
    }
    int numPrimeArrangements(int n) {
        int num1 = 0;
        int num2 = 0;
        for(int i = 1; i <= n; i++) {
            if(isprime(i)) {
                num1++;
            } else {
                num2++;
            }
        }
        return fac(num1) * fac(num2) %1000000007;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值