// ver. 1 속도가 느림(3중 for문)
#include <stdio.h>

int main()
{
    int n, m;
    int d1, d2, d3;

    scanf("%d %d", &n, &m);
    scanf("%d %d %d", &d1, &d2, &d3);
    int t = n - m; // n - m이 (독도새우 수) - (보호해야 하는 수)이므로 n - m을 해준다.
    int ans = 1e8; // 1e8 = 100000000

    // i는 d1을 사용한 횟수다.
    for (int i = 0; i <= t; i++) 
    {
        // j는 d2를 사용한 횟수다.
        for (int j = 0; j <= t; j++) 
        {
            // k는 d3를 사용한 횟수다.
            for (int k = 0; k <= t; k++) 
            {
                // x에 d1, d2, d3를 이용해 잡은 새우 수를 모두 더해준다.
                int x = i * d1 + j * d2 + k * d3;
                // x가 t와 같다는것은 잡아야 하는 새우 수를 충족했다는 뜻
                if (x == t) 
                    // 만약 d1,d2,d3를 사용한 횟수인 i,j,k가 ans보다 작다는것은 최솟값이 나왔다는 것이므로 바꿔준다.
                    if (i + j + k < ans) ans = i + j + k; 
            }
        }
    }
    // 만약 ans가 1e8라는건 모든 새우를 못잡는것이므로 -1을 출력한다.
    if (ans == 1e8) printf("-1"); 
    else printf("%d", ans);
}

'SFPC > 2022' 카테고리의 다른 글

2022 SFPC B1  (0) 2023.02.16
2022 SFPC A1  (0) 2023.02.03
2022 SFPC pE1 ver.2  (0) 2023.02.02
2022 SFPC pE1 ver.1  (0) 2023.02.02
2022 SFPC pD1 ver.2  (0) 2023.02.01
2022 SFPC pC1,2  (1) 2023.01.31
#include <stdio.h>

int M[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31 };

int is_yun_year(int y)
{
	return (((y % 4) == 0) && ((y % 100 != 0)) || ((y % 400) == 0));
}
int main()
{
	// k = 황금 사과가 수확되기 시작하는 사과와 배의 개수
	// n = 2일마다 수확되는 사과의 개수
	// m = 3일마다 수확되는 배의 개수
	int k, n, m;

	scanf("%d %d %d", &k, &n, &m);

	// k가 수확된 사과와 배의 개수를 저장하는 변수인데
	// 첫날에 사과와 배를 수확했기 떄문에
	// 첫번째로 수확된 사과와 배 제거
	k -= n + m;

	//6일을 기준으로 한 사가와 배의 수확량
	int num6 = 3 * n + 2 * m;

	// days 날에 처음으로 황금사과를 수확
	int days = 0; // 첫번째 황금 사과 수확까지 걸리는 날
	if (k > 0) // 만약 수확해야 하는 사과와 배의 개수가 0보다 크다면
	{
		int x = k / num6; // num6를 반복해야 하는 횟수
		days += x * 6; // days에 x * 6일만큼 사과와 배를 수확

		// k는 총 수확해야하는 사과와 배의 개수이니 
		// k에 x * 6일만큼 수확한 사과와 배를 제거해준다.
		k -= x * num6;

		// 만약 수확해야 하는 사과와 배가 없으면
		// days에 2를 추가해 첫 황금 사과를 수확하는 날짜를 저장한다.
		if (k == 0) days += 2;

		// 만약 수확해야 하는 사과와 배가 2일마다 수확되는 사과의 양보다 작거나 같다면
		// 한번 더 사과를 수확한 후 다음 사과 수확일에 황금 사과를 수확하면 되므로
		// days에 4를 추가해 첫 황금 사과를 수확하는 날짜를 저장한다.
		else if (k <= n) days += 4;

		// 만약 수확해야 하는 사과와 배가 2일마다 수확되는 사과의 양과 3일마다 수확되는 배의 양을 합친 것보다 작거나 같다면
		// 한번 씩 사과와 배를 수확한 후 황금 사과를 수확하면 되므로
		// days에 4를 추가해 첫 황금 사과를 수확하는 날짜를 저장한다.
		else if (k <= n + m) days += 4;

		// 만약 수확해야 하는 사과와 배가 2일마다 수확해야 하는 사과를 2번 수확한 것과 3일마다 수확되는 배의 양을 합친 것보다 작거나 같다면
		// 사과를 두 번 수확하도 배를 한 번 수확하면 황금 사과를 수확하는 날짜가 나오므로
		// days에 6를 추가해 첫 황금 사과를 수확하는 날짜를 저장한다.
		else if (k <= 2 * n + m) days += 6;

		// 위에 작업을 다 거쳤는데도 끝나지 않았다면 num6 과정을 한번 더 하면 되므로
		// days에 8을 더한다.
		else days += 8;
	}
	else days = 2; // 만약 k가 0보다 작다면 다음 사과 수확날에 황금 사과를 수확할 것이므로 days를 2로 정한다.

	int year = 2023, month = 1, day = 1;

	while (1)
	{
		// 만약 is_yun_year 함수에서 결과가 1이 나오면 윤년이란 뜻인데
		// M[2]가 2월 달 끝부분이므로 29로 바꾼다.
		if (is_yun_year(year)) M[2] = 29; 
		else M[2] = 28; // 윤년이 아니면 28로 둔다.
		if (days >= M[month]) // 만약 첫번쨰 황금 사과 수확일이 달 수를 넘어버린다면
		{
			days -= M[month]; // days에 달 수를 빼고
			month++; // 달을 하나 올린다.
			if (month == 13) // 만약 month가 13이면 년도를 올려줘야 하므로
			{
				year++; // 년도를 올려주고
				month = 1; // 달을 1로 바꿔준다.ㄴ
			}
		}
		else break; //days가 M[month]를 넘지 않으면 이 반복문을 나간다.
	}
	// 년도는 4칸에 맞춰서 출력하고
	// 월과 일은 2칸에 맞춰 출력한다.
	printf("%04d/%02d/%02d", year, month, day + days);
}

'SFPC > 2022' 카테고리의 다른 글

2022 SFPC B1  (0) 2023.02.16
2022 SFPC A1  (0) 2023.02.03
2022 SFPC pE1 ver.2  (0) 2023.02.02
2022 SFPC pE1 ver.1  (0) 2023.02.02
2022 SFPC pD1 ver.2  (0) 2023.02.01
2022 SFPC pD1 ver. 1  (0) 2023.02.01

+ Recent posts