https://www.acmicpc.net/problem/21921
투포인터..
0부터 N-1까지 쭉 방문할건데,
front
, rear
포인터 2개를 이용해서 방문한다.
먼저 front
는 front
- rear
가 x-1
이 될 때까지 계속 증가해주며 부분합에 더해준다.
(front - rear
= 방문 기간)
front - rear == x-1
이 된 순간,
이전 방문자수와 비교해주고, 또 front
값을 증가해준다.
방문기간을 초과하면 부분합에서 현재rear
값을 빼주고, rear
를 증가해준다.
이렇게 계속 조건에 따라 해주면 된당.
while 조건을 잘못 넣어서 몇 분 잡아먹었지만 그래두 낫밷 ,,
문제가 쉽긴하지만,, 1트만에 성공해서 뿌듯 ^_^ 역시 난 실딱이었다 .. . ..
#include <iostream>
using namespace std;
int arr[250'001];
int main()
{
int n, x;
cin >> n >> x;
for (int i = 0; i < n; i++)
cin >> arr[i];
int front = 0;
int rear = 0;
int visitor = 0;
int cnt = 0;
int sum = arr[rear];
while (front < n && rear <= n - x) {
if (front - rear == x - 1) {
if (sum == visitor) ++cnt;
if (sum > visitor) {
visitor = sum;
cnt = 1;
}
sum += arr[++front];
}
else if (front - rear < x - 1) {
sum += arr[++front];
}
else {
sum -= arr[rear++];
}
}
if (visitor == 0) cout << "SAD" << endl;
else cout << visitor << endl << cnt << endl;
}