洛谷【入门4】数组 P1614 爱与愁的心痛

爱与愁的心痛

题目背景
(本道题目隐藏了两首歌名,找找看哪~~~)

《爱与愁的故事第一弹·heartache》第一章。

《我为歌狂》当中伍思凯神曲《舞月光》居然没赢给萨顶顶,爱与愁大神心痛啊~~~而且最近还有一些令人伤心的事情,都让人心痛(最近真的很烦哈)……

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

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

第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数ai

代表第 i 件事的刺痛值 ai

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

输入输出样例
输入 #1复制

8 3
1
4
7
3
1
2
4
3

输出 #1复制

6

说明/提示
数据规模与约定

对于 30% 的数据,保证 n≤20。
对于 60% 的数据,保证 n≤100。
对于 90% 的数据,保证 n≤103
对于 100% 的数据,保证 0≤m≤n≤3×103,1≤ai≤100。

这里提供两种写法。
第一种
把前3个数加为temp,在m+1…n中搜索,每次减去区间外的数值,加上新进入区间的数值,再更新答案

AC代码(C++)

#include <iostream>
#include <algorithm>


using namespace std;

int main()
{

    int n, m;
    int arr[3010]{};        //初始化为空(0)
    int ans{};               //初始化为空(0)
    int temp = 0;
    cin >> n >> m;

    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
        if (i < m)
        {
            temp += arr[i];
            ans = temp;   //每次都更新答案
            continue;       //前三个直接加
        }
        //每次减去区间外的数值,加上新进入区间的数值,再更新答案
        ans = min(ans, temp += arr[i] - arr[i - m]);
    }
    cout << ans;
    return 0;
}

第二种
模拟,把数据全部存入数组后遍历数组,一步一步,三个三个寻找最小组合。
AC代码(C++)

#include <iostream>
#include <climits>

using namespace std;

int main()
{

    int n, m;
    int arr[100100]{};        //初始化为空(0)
    int ans = INT_MAX;      //初始化为假定无穷大高方便找最少
    int temp = 0;
    cin >> n >> m;
    //把数据存入数组
    for (int i = 0; i < n; i++)
        cin >> arr[i];
    //n - m + 1的+1不能忘否则会少计算一个数
    for (int i = 0; i < n - m + 1; i++)
    {
    	//计算当前组和
        for (int j = 0; j < m; j++)
            temp += arr[i + j];
        if (temp < ans)     //发现更小组和更新答案
            ans = temp;
        temp = 0;
    }
    cout << ans;
    return 0;
}

PS:部分测试数据
输入:

15 4
13
11
21
8
47
21
4
22
52
49
96
1
1
98
49

输出:

53

输入:

600 600
76
87
100
95
70
74
23
17
92
74
74
53
24
79
64
42
78
53
5
45
77
97
74
18
55
26
64
18
98
52
39
83
49
28
50
91
19
48
48
48
67
92
40
23
3
61
97
40
25
25
100
85
75
68
51
11
94
9
64
61
87
32
93
15
9
90
32
74
41
61
18
68
3
74
16
38
44
20
10
52
84
87
51
22
18
37
53
36
26
43
77
23
23
47
6
66
97
73
67
81
52
96
41
49
13
87
37
88
76
95
34
100
27
86
71
18
10
28
99
51
40
57
13
98
37
63
78
23
76
42
21
5
3
13
21
31
60
19
21
11
66
74
72
34
77
66
82
22
55
10
15
14
79
74
95
72
2
56
77
12
71
56
76
52
90
89
63
25
69
58
31
73
59
86
58
83
54
36
58
6
3
93
20
22
16
42
98
83
29
77
36
55
93
67
30
54
83
39
37
48
24
53
19
16
39
74
91
6
100
95
89
58
45
4
34
6
74
42
44
52
75
22
85
17
79
24
33
61
91
28
80
17
60
12
44
8
93
90
35
1
44
71
13
21
43
76
41
40
38
80
40
58
31
3
58
30
25
70
79
7
97
30
25
50
41
73
56
71
54
34
86
2
13
89
53
92
65
23
93
58
51
91
70
99
66
73
81
98
46
41
14
18
58
31
75
7
53
34
50
79
60
66
60
82
87
87
66
2
10
72
84
78
43
22
60
26
37
37
14
10
75
22
71
4
42
74
2
70
74
89
41
5
48
3
81
4
15
35
68
16
43
21
98
5
53
89
29
17
12
20
42
88
47
34
97
40
40
37
88
46
81
45
42
64
29
5
61
76
41
45
87
9
59
28
1
44
35
28
21
18
72
20
80
52
57
85
86
71
49
3
38
34
64
18
86
4
55
77
81
82
41
14
89
5
42
76
41
67
88
28
35
20
21
89
11
27
89
43
97
90
88
50
50
34
54
12
9
38
81
46
83
87
42
14
85
96
44
99
99
66
69
81
80
23
67
64
72
51
50
15
95
19
75
75
16
94
64
10
26
8
32
97
37
5
30
57
64
37
17
93
14
14
87
22
11
83
50
45
97
45
66
17
58
16
100
5
91
10
30
32
97
28
68
73
11
97
3
93
28
54
84
79
87
97
99
60
60
64
49
51
17
18
79
6
45
67
88
17
87
30
72
7
62
36
21
39
59
80
18
85
88
99
11
65
80
20
24
42
39
22
81
27
20
52
58
10
88
30
34
54
84
47
98
7
38
10
91
19
7
44
83
31
37
94
56
18
51
35
93
61
37
81
66
8
27
85
18
36
67
55
40
74
87
71
67
71
51
88
13
60
3
35
93
39
73
56
56
30
54
31

输出:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值