문제 링크
https://www.acmicpc.net/problem/21921
문제
찬솔이는 블로그를 시작한 지 벌써 N일이 지났다.
요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.
찬솔이는 X일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.
찬솔이를 대신해서 X일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.
입력
첫째 줄에 블로그를 시작하고 지난 일수 N와 X가 공백으로 구분되어 주어진다.
둘째 줄에는 블로그 시작 1일차부터 N일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.
출력
첫째 줄에 X일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.
만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.
제한
- 1≤X≤N≤250,000
- 0≤방문자 수≤8,000
예제 입력 1
5 2
1 4 2 5 1
예제 출력 1
7
1
예제 입력 2
7 5
1 1 1 1 1 5 1
예제 출력 2
9
2
예제 입력 3
5 3
0 0 0 0 0
예제 출력 3
SAD
알고리즘 분류
- 브루트포스 알고리즘
- 누적 합
풀이
블로그 방문 수의 누적합을 구하고, 기간마다 방문 수의 합을 탐색하여 방문 수가 가장 높은 기간과 그 기간의 개수를 구한다.
코드
#include <iostream>
#include <string>
#include <cmath>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <climits>
#define FASTIO cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define MAX 250001
#define LL long long
#define INF 1e12
using namespace std;
int N, X;
int Sum[MAX];
int Answer_V, Answer_D;
void Input() {
cin >> N >> X;
for (int i = 1; i <= N; i++) {
int A;
cin >> A;
Sum[i] = Sum[i - 1] + A;
}
}
void Settings() {
for (int i = X; i <= N; i++) {
int Tmp = Sum[i] - Sum[i - X];
if (Answer_V < Tmp) {
Answer_V = Tmp;
Answer_D = 1;
}
else if (Answer_V == Tmp) {
Answer_D++;
}
}
}
void Find_Answer() {
if (Answer_V > 0) {
cout << Answer_V << "\n" << Answer_D << "\n";
}
else {
cout << "SAD\n";
}
}
int main() {
FASTIO
Input();
Settings();
Find_Answer();
return 0;
}
'BOJ > Silver' 카테고리의 다른 글
[BOJ/Silver 1] 백준 16507 어두운 건 무서워(C++) (0) | 2022.03.25 |
---|---|
[BOJ/Silver 2] 백준 16139 인간-컴퓨터 상호작용(C++) (0) | 2022.03.24 |
[BOJ/Silver 3] 백준 17390 이건 꼭 풀어야 해!(C++) (0) | 2022.03.23 |
[BOJ/Silver 3] 백준 16713 Generic Queries(C++) (0) | 2022.03.23 |
[BOJ/Silver 3] 백준 12847 꿀 아르바이트(C++) (0) | 2022.03.23 |