반응형
[ 문제 ]
JOI 상점가에서는 포인트 카드 서비스를 실시하고 있다. 각 포인트 카드에는 도장을 찍을 수 있는 칸이 총 2N개 있어, 상품을 구매하면 뽑기를 해서 결과에 따라 '당첨' 또는 '꽝' 도장이 찍힌다. 한 칸에 두 번 이상 도장을 찍을 수는 없다. 2N개 중 N개 이상의 칸에 당첨 도장이 찍힌 포인트 카드는 경품과 교환할 수 있다. 또, 한 칸에 찍힌 도장을 1엔을 내고 다른 도장으로 바꿀 수 있다.
JOI 군은 2N개 칸을 다 채운 포인트 카드를 M장 가지고 있다. i번째 포인트 카드에는 A_i개의 당첨 도장과, B_i개의 꽝 도장이 찍혀 있다.
JOI 군은 M-1개 이상의 경품을 가지려고 한다. 이에 필요한 비용의 최솟값을 구하라.
[ 코드 ]
1. 내 코드
StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
StreamWriter sw = new StreamWriter(new BufferedStream(Console.OpenStandardOutput()));
string[] s = sr.ReadLine().Split();
int n = int.Parse(s[0]);
int m = int.Parse(s[1]);
int count = 0;
int result = 0;
int[][] arr = new int[m][];
for (int i = 0; i < m; i++)
{
int[] num = sr.ReadLine().Split().Select(int.Parse).ToArray();
int a = num[0];
int b = num[1];
if (n > a)
{
arr[i] = new int[] { a, b };
}
else
{
count++;
}
}
arr = arr.Where(x => x != null).OrderByDescending(x => x[0]).ToArray();
if(count >= (m - 1))
{
sw.Write(result);
sw.Flush();
}
else
{
for (int i = 0;i < arr.Length; i++)
{
if(count >= (m - 1))
{
sw.Write(result);
sw.Flush();
break;
}
else if(n > arr[i][0])
{
result += (n - arr[i][0]);
count++;
}
}
}
sw.Close();
sr.Close();
2. 다른 사람 코드 참고
- 거의 비슷하고, 출력 for문만 다름
StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
StreamWriter sw = new StreamWriter(new BufferedStream(Console.OpenStandardOutput()));
string[] s = sr.ReadLine().Split();
int n = int.Parse(s[0]);
int m = int.Parse(s[1]);
int count = 0;
int result = 0;
int[][] arr = new int[m][];
for (int i = 0; i < m; i++)
{
int[] num = sr.ReadLine().Split().Select(int.Parse).ToArray();
int a = num[0];
int b = num[1];
if (n > a)
{
arr[i] = new int[] { a, b };
}
else
{
count++;
}
}
arr = arr.Where(x => x != null).OrderByDescending(x => x[0]).ToArray();
if(count >= (m - 1))
{
sw.Write(result);
sw.Flush();
}
else
{
for (int i = 0;i < (m - 1 - count); i++)
{
result += (n - arr[i][0]);
}
sw.Write(result);
sw.Flush();
}
sw.Close();
sr.Close();
- 내림차순 정렬을 안하면 틀리게 됩니다................ ㅜㅜ 왜냐면 최솟값을 구해야하기때문에 a가 제일 큰값이여야 해서..
바보같이 이거 안해서 틀렸당...
[ 실행화면 ]
문제링크: https://www.acmicpc.net/problem/14471
14471번: 포인트 카드
예제 입출력 1에서, 포인트 카드 1의 꽝 도장 3개와 포인트 카드 3의 꽝 도장 1개를 당첨 도장으로 바꾸면, 4엔으로 5-1=4장의 카드가 경품과 교환 가능하게 되어, 이것이 최소 비용이다. 예제 입출
www.acmicpc.net
반응형
'Language > C#' 카테고리의 다른 글
[C#] 백준 27961번 고양이는 많을수록 좋다 (0) | 2024.03.14 |
---|---|
[C#] 백준 30019번 강의실 예약 시스템 (0) | 2024.03.14 |
[C#] 백준 30700번 KOREA 문자열 만들기 (0) | 2024.03.12 |
[C#] 백준 18238번 ZOAC 2 (0) | 2024.03.11 |
[C#] 백준 28062번 준석이의 사탕 사기 (0) | 2024.03.11 |