할머니의 콤퓨타 도전기

[C++] 백준 11659번: 구간 합 구하기 4 본문

Algorithm/Problem Solving

[C++] 백준 11659번: 구간 합 구하기 4

ji.o.n.e 2020. 7. 31. 14:03

https://www.acmicpc.net/problem/11659

 

11659번: 구간 합 구하기 4

첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000), 합을 구해야 하는 횟수 M (1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에

www.acmicpc.net

  • 풀이 방법

다이나믹 프로그래밍으로 풀 수 있는 문제입니다.

d[i] : i번째 수까지의 합

a[i] : i번째 수

따라서 i번째 수부터 j번째 수까지 합은 d[j] - d[i] + a[i] 이 됩니다.

 

입출력이 많기 때문에 cin.tie(0)을 해주어야 합니다.

 

cin.tie(0) : cin은 cout에 묶여있는데, 이는 cin을 할 때마다 cout의 버퍼를 먼저 비운다는 것을 의미합니다. 따라서 이 묶음을 풀어주면 빨라진다고 합니다. (여러 케이스에 대해 입력과 출력을 반복해야 할 때는 필수)

  • 소스 코드
#include <bits/stdc++.h>
using namespace std;
int a[100001];
int d[100001];
int s, e;
int main()
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        d[i + 1] = d[i] + a[i];
    }

    for (int i = 0; i < m; i++)
    {
        cin >> s >> e;
        cout << d[e] - d[s] + a[s - 1] << '\n';
    }
    return 0;
}

'Algorithm > Problem Solving' 카테고리의 다른 글

BOJ 11657 타임머신  (0) 2020.08.17
[C++] Programmers: N으로 표현  (0) 2020.08.16
[C++] Programmers: 체육복  (0) 2020.08.16
[C++] Programmers: 더 맵게  (0) 2020.08.13
[C++] Programmers: K번째 수  (1) 2020.08.03
Comments