알고리즘&자료구조/문제

[BOJ] 10025 게으른 백곰 C++

Nakuri 2023. 2. 20. 04:47
728x90

개요

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

 

10025번: 게으른 백곰

첫 줄에 정수 N과 K가 들어온다. 둘째 줄부터 N째 줄까지, 공백을 사이에 두고 각 양동이의 얼음의 양을 나타내는 gi와 양동이의 좌표를 나타내는 xi가 주어진다.

www.acmicpc.net

실버3 난이도 문제다.

풀이

백곰 앨버트가 가장 많은 얼음을 취할 수 있는 최적의 위치를 찾아야 한다.

 

브루트포스로 접근해서 한 번 틀렸다.

생각해 보니 다 계산할 필요가 없었다.

현재 위치에서 취하는 얼음의 범위가 ice[n] ~ ice[m]라고 가정하자.

다음 범위는 ice[n+1] ~ ice[m+1]일 것이다.

다 계산할 필요 없이 현재 범위에서 -[n] + [m+1]만 해주면 된다.

이게 슬라이딩 윈도우였다.

코드

#include<iostream>
#include<algorithm>
using namespace std;
constexpr int LIMIT = 1000000;

int N, K;
int g, x;
int ice[LIMIT+2];
int ans, sum;

void TwoPointer()
{
	int head = 0;
	int tail = K * 2;
	if (tail > LIMIT)
	{
		for (const auto& i : ice)
			sum += i;

		ans = sum;
		return;
	}
	while (tail <= LIMIT)
	{
		sum = 0;
		for (int i = head; i <= tail; i++)
			sum += ice[i];

		ans = max(ans, sum);

		head++;
		tail++;
	}
}
int main()
{
	cin.tie(0)->sync_with_stdio(0);
	
	cin >> N >> K;

	for (int i = 0; i < N; i++)
	{
		cin >> g >> x;
		ice[x] = g;
	}

	TwoPointer();

	cout << ans;
}

'알고리즘&자료구조 > 문제' 카테고리의 다른 글

[BOJ] 2473 세 용액 C++  (0) 2023.02.23
[BOJ] 2467 용액 C++  (0) 2023.02.20
[BOJ] 16953 A → B C++  (0) 2023.02.20
[BOJ] 12851 숨바꼭질 2 C++  (0) 2023.02.20
[BOJ] 13913 숨바꼭질 4 C++  (0) 2023.02.20