그리디_큰 수의 법칙

·2022년 6월 20일
0

이코테_알고리즘

목록 보기
20/23

접근

: result값 구할때 for문 돌리려고 했는데, 생각을 바꿈.
몫과 나머지로 접근함.

코드


using namespace std;
#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
	//m 번 더하여 가장 큰수를 만들자. 
	// 특정 인덱스는 k번 초과 하면 안됨.

	//가장 큰값을 고르고, 
	//두번 째로 카운트롤 갱신하자. 

	

	int n, m, k;
	cin >> n >> m >> k;
	vector<int>v(n, 1);

	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}

	sort(begin(v), end(v), greater<int>());

	int first = v[0];
	int second = v[1];

	//==================//
	

	// 2 4 5 4 6 
	// max : 6 / 2nd : 5 이므로 
	// m : 8 , k : 3 이므로 
	// 6 6 6 5 6 6 6 5 -> 36 + 10 : 46 

	// 몫과 나머지로 처리해도 괜찮을 듯함...
	// 8 번이므로 m + 1 로 몇번을 순환하는 지 몫과 나머지가 필요함. 
	//  8 -> 총 2번의 순환이 발생하고, 나머지 없음. 
	// 2번 순환함..
	// 세분화 하자 : (3번의 * first + 1번의 * second ) * 2번 순환으로 표현 가능함.

	// 만약에 m : 2하면?? 
	// m % k : 2 % 3 : 2이고, 몫은 0임 
	// 즉 0번의 순환 나머지는 바로 first 처리하면 됨. 

	// 결과 : m 과 k + 1 의 몫과 나머지를 구함. 
	// 몫은 순환을 총 몇번했는지 .

	int mock = m / (k + 1);
	int remainder = m % (k + 1);

	//cout << mock << endl;
	//cout << remainder << endl;
	int result = (first * k + second * 1) * mock + remainder * first;
	cout << result << endl;

}
profile
🔥🔥🔥

0개의 댓글