【洛谷】 P1614 爱与愁的心痛

先说一下一个有趣的事情,这道题我在12月第一次写,一般写过会有做题记录,刚刚在一份用户自创题单又遇到过,直觉告诉我这题似曾相识,但是却想不起来了,我又写了一遍,不过两次方法不一样。

题目描述

最近有 n 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 m 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。

输入格式

第一行有两个用空格隔开的整数,分别代表 n 和 m。

第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数 ai​ 代表第 i 件事的刺痛值 ai​。

输出格式

输出一行一个整数,表示连续 m 个刺痛值的和的最小值是多少。

输入输出样例

输入

8 3
1
4
7
3
1
2
4
3

输出 

6

题解

一维前缀和的应用,前缀和类似高中的数列前n项和,设一个数组arr[500],sum[500],sum[i]代表arr[0]到arr[i]的和。

sum[0]=arr[0] ,i=0

sum[i]=sum[i-1]+arr[i] ,i>0

#include<bits/stdc++.h>
using namespace std;
int arr[3000];
int sum[5000];
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    sum[0] = arr[0];//i=0的前缀和
    for (int i = 1; i < n; i++)sum[i] = sum[i - 1] + arr[i];//i>0的前缀和
    int min = sum[m - 1];
    for (int i = 1; i <=n - m; i++)
    {
        if(min > (sum[i + m - 1] - sum[i-1]))min =sum[i + m - 1] - sum[i-1];
    }
    cout << min;
    return 0;
}

下面是第一次写的代码,没用前缀和,前缀和是一种预处理,可以降低时间复杂度。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值