본문 바로가기
알고리즘/백준

[백준] 6236 용돈 관리 c++

by 오오오니 2022. 9. 22.

 

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

 

6236번: 용돈 관리

현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로

www.acmicpc.net

인출 횟수를 M 번을 맞춰야하며

모자라면 남은 금액은 통장에 넣고 다시 돈을 인출 할 수 있다.

mid가 k 원이고 돈을 계속 쓰면 감소할 것이므로  k에다가 mid 값을 저장 해주었다.

그 후에 돈이 모자라게 되면 ( num[i]>k ) k=mid 로 해주어 다시 돈을 인출 한것처럼 해주었다.

cnt가 m 보다 크게되면 인출 금액을 더 크게 해주어서 cnt를 줄여주고

cnt가 m보다 작게되면 인출 금액을 더 작게 해주어 더 자주 인출하도록 해주었다.

cnt가 m 하고 같아도 최소금액 K를 구해야하기 때문에 인출금액을 더 작게 해주었다.

#include<iostream>

using namespace std;
int N, M, K, sum; //N일동안 M 번만
int num[100001];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> N >> M;
	for (int i = 0; i < N; i++)
	{
		cin >> num[i];
		sum += num[i];
	}

	int left = 1, right = sum, mid, cnt, ans = sum;//왜 left가 0으로 시작되면 안될까?
	bool chk = false;

	while (left <= right)
	{

		mid = (left + right) / 2;
		K = mid;
		cnt = 1;
		for (int i = 0; i < N; i++)
		{
			if (num[i] > mid)
			{
				chk = true;
				break;
			}
			if (K >= num[i])
			{
				K -= num[i];

			}
			else//모자라게 되면 남은 금액은 통장에 집어넣고 다시 K원을 인출한다. 
			{
				K = mid;
				cnt++;
				K -= num[i];

			}

		}
		//	cout<<right<<"  "<<left<<"  " << mid << endl;
		if (cnt > M || chk)
		{
			left = mid + 1;
			chk = false;
		}
		else if (cnt <= M)
		{
			ans = mid;
			right = mid - 1;
		}

	}

	cout << ans;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1707 이분 그래프 C++  (0) 2022.12.29
[백준] 14503 로봇 청소기 C++  (0) 2022.12.29
[백준] LCS c++  (1) 2022.09.21
[백준] 11052 카드 구매하기 c++  (1) 2022.09.11
[백준] 9655 돌 게임  (0) 2022.09.10