首页 > 编程语言 >每日OJ题_牛客_比那名居的桃子_滑动窗口/前缀和_C++_Java

每日OJ题_牛客_比那名居的桃子_滑动窗口/前缀和_C++_Java

时间:2024-10-12 22:50:42浏览次数:10  
标签:right 窗口 OJ int ++ C++ 牛客 桃子 left

目录

牛客_比那名居的桃子_滑动窗口/前缀和

题目解析

C++代码

Java代码


牛客_比那名居的桃子_滑动窗口/前缀和

比那名居的桃子 (nowcoder.com)

描述:

        小红有一天看到了一只桃子,由于桃子看上去就很好吃,小红很想把它吃掉。
已知吃下桃子后,每天可以获得 ai​ 的快乐值,但是每天会获得 bi​ 的羞耻度。桃子的持续效果一共为 k 天。

小红想知道,自己在哪一天吃下果实,可以获得尽可能多的快乐值?

        如果有多个答案获得的快乐值相等,小红希望获得尽可能少的羞耻度。如果有多个答案的快乐值和羞耻度都相等,由于小红实在太想吃桃子了,她希望尽可能早的吃下桃子。


题目解析

  • 滑动窗口的思想: 由题意要枚举所有大小为 k 的子数组,并且求出这段子数组中快乐值和羞耻度之和。因此可以利用滑动窗口的思想,用两个变量维护大小为 k 的窗口的总和,并且不断更新即可。
  • 前缀和思想: 这个就比较简单了,先预处理出来快乐值和羞耻度的前缀和数组,然后枚举的过程中直接求出一段区间的和即可。但是相比较于滑动窗口的思想,会有空间消耗。

C++代码

#include <climits>
#include <ios>
#include <iostream>
#include <vector>
using namespace std;
#define int long long

signed main()
{
    int n = 0, k = 0; // k是滑动窗口的大小
    cin >> n >> k;
    vector<int> a(n), b(n);
    for (int i = 0; i < n; ++i)
    {
        cin >> a[i];
    }
    for (int i = 0; i < n; ++i)
    {
        cin >> b[i];
    }
    int aSum = 0, bSum = 0, res = 0;
    int aMax = INT_MIN, bMin = INT_MAX;
    for (int left = 0, right = 0; right < n; ++right)
    {
        aSum += a[right]; // 进窗口
        bSum += b[right]; // 进窗口
        while(right - left + 1 > k) // 判断
        {
            aSum -= a[left];
            bSum -= b[left];
            ++left; // 出窗口
        }
        if(aSum > aMax || (aSum == aMax && bSum < bMin)) // 更新结果
        {
            res = left;
            aMax = aSum;
            bMin = bSum;
        }
    }
    cout << res + 1 << endl;
    return 0;
}

Java代码

import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), k = in.nextInt();
        long[] a = new long[n + 1];
        long[] b = new long[n + 1];
        for(int i = 1; i <= n; i++)
        {
            a[i] = in.nextLong();
        }
        for(int i = 1; i <= n; i++)
        {
            b[i] = in.nextLong();
        }

        int left = 1, right = 1;
        long hSum = 0, sSum = 0, hMax = 0, sMin = 0, begin = 0;
        while(right <= n)
        {
            
            hSum += a[right]; sSum += b[right]; // 进窗⼝
            while(right - left + 1 > k) // 出窗⼝
            {
                hSum -= a[left]; sSum -= b[left];
                left++;
            }
            if(right - left + 1 == k) // 更新结果
            {
                if(hSum > hMax)
                {
                    begin = left;
                    hMax = hSum;
                    sMin = sSum;
                }
                else if(hSum == hMax && sSum < sMin)
                {
                    begin = left;
                    sMin = sSum;
                }
            }
            right++;
        }

        System.out.println(begin);
    }
}

标签:right,窗口,OJ,int,++,C++,牛客,桃子,left
From: https://blog.csdn.net/GRrtx/article/details/142873080

相关文章

  • 从0开始的vscode安装及环境配置教程(C/C++)Windows系统
    1.vscode简介VSCode是微软出的一款轻量级编辑器,它本身只是一款文本编辑器而已,并不是一个集成开发环境(IDE),几乎所有功能都是以插件扩展的形式所存在的。因此,我们想用它编程,不只是把vscode下载下来就行,还需要安装对应编程语言的扩展以及相应的编译器。2.安装vscode进入vscode......
  • C++中比较方便的几个有关字符串的函数
    以下是一些个人总结的C++中对新手来说比较方便使用的几个有关字符串的函数。注意,说的是字符串而不是字符数组。如果有其他,欢迎在评论区留言。1.getline(),这个函数可以输入一行字符串,通常情况下,这个函数的使用通常如下://getline(cin,字符串名);     注意:getline()的......
  • 生产者消费者c++ 讲解和代码示例
    生产者-消费者问题的C++讲解和代码示例一、问题描述生产者-消费者问题是经典的多线程同步问题,涉及两个类型的线程:生产者线程:负责生成数据并放入共享缓冲区。消费者线程:负责从共享缓冲区取出数据进行处理。关键挑战在于:同步:确保生产者和消费者在访问共享缓冲区时不发生......
  • 107-免杀对抗-C&C++&溯源ShellCode上线&混淆变异算法&回调编译执行
    知识点#知识点:1、ShellCode-分析&朔源&感知2、ShellCode-混淆&编码&算法3、回调执行解析-API&汇编&句柄#章节点:编译代码面-ShellCode-混淆编译代码面-编辑执行器-编写编译代码面-分离加载器-编写程序文件面-特征码定位-修改程序文件面-加壳花指令-资源代码加载面-Dll......
  • C, C++中的宏是什么
    在C++中,宏(Macro)是一种由预处理器(Preprocessor)处理的文本替换机制。宏通过#define指令定义,可以在编译前对代码进行替换,从而实现代码的复用、条件编译等功能。宏在C和C++中都广泛使用,但由于其特性,也可能带来一些潜在的问题,因此在使用时需要谨慎。宏的基本概念宏是在预处......
  • 用C/C++构建自己的Redis——第六章、事件循环和计时器
    用C/C++构建自己的Redis——第六章、事件循环和计时器文章目录用C/C++构建自己的Redis——第六章、事件循环和计时器前言一、超时和计时器二、链表三、事件循环四、链表排序4.1寻找最近的计时器4.2激活计时器4.3维护计时器五、测试总结前言这一章我们将一起学......
  • C++基础——书写“Hello World“
    C++基础——书写"HelloWorld"一、前言二、书写"HelloWorld"1.头文件2.主文件3.整体代码4.运行结果三、总结一、前言首先为大家介绍一下什么是C++。上述描述来自于百度百科!!!二、书写"HelloWorld"1.头文件#include"stdafx.h"#include<iostream>usingnam......
  • c++(自创游戏7.1)
    上代码!#include<bits/stdc++.h>#include<windows.h>usingnamespacestd;intmain(){inta,b,c,d,e,e1,e2,e3,e4,n; n=0; if(n==0)cout<<"这天,你跟往常一样,准备去上班。";n++; Sleep(2000); cout<<endl; if(n==1)cout<<"走到办公......
  • 题解:牛客小白月赛102(A - C)
    A序列中的排列题意:每次给你两个正整数\(n,k\),并给你一段长度为\(n\)的序列。(所有输入均为小于等于100的正整数)问:原序列中是否存在子序列,使得这个子序列是\(k\)的排列子序列:某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置(在前或在后)而形成的......
  • 链表排序算法(C++):数组辅助排序、插入排序、归并排序
    文章目录借助数组排序插入排序归并排序测试用例数组排序算法参考:冒泡排序、插入排序、选择排序、归并排序、快速排序算法(C++实现)-CSDN博客链表排序算法参考:链表排序总结(全)(C++)-CSDN博客这里主要介绍三种链表排序方法,第一种是借助数组进行排序的方法,第二种是插入排......