[백준] Baekjoon Online Judge
문제
경래는 닭을 기르는데 올 겨울 달걀 풍년으로 함박 웃음을 짓고 있다. 그리고 이 달걀을 영양란으로 둔갑하여 옥션에 판매하려한다.
경래는 총 N개의 달걀이 있고, 그의 잠재적인 고객은 총 M명이다. 그리고 각각의 i번째 고객은 각자 달걀 하나를 Pi 가격 이하로 살 수 있다고 밝혔다.
경래는 영양란이라 속인 죄책감에 한 고객에게 두 개 이상의 달걀은 팔지 않기로 하였다. 하지만 위의 규칙 하에 수익은 최대로 올리고 싶기에 얼마로 팔지 고민하고 있다. 즉, A가격에 달걀을 판다고 하면 Pi가 A가격보다 크거나 같은 모든 고객은 달걀을 산다는 뜻이다. (물론 달걀 총 수량을 초과하여 팔 수 는 없다)
문제는 이러한 경래를 도와 최대 수익을 올릴 수 있는 달걀의 가장 낮은 가격을 책정하는 것이다.
입력
첫째 줄에 정수 N(1 ≤ N ≤ 1,000)과 M(1 ≤ M ≤ 1,000)이 입력된다. 둘째 줄부터 M+1번째 줄까지 i+1번째 줄에는 Pi(1 ≤ Pi ≤ 1,000,000)가 입력된다.
출력
첫째 줄에 경래가 책정한 가격과 이 가격으로 올릴 수 있는 수익을 출력한다.
예제 입력 | 예제 출력 |
5 4 2 8 10 7 |
7 21 |
풀이
#include <iostream>
#include <algorithm>
using namespace std;
int N, M; // N개의 달걀, 고객 M명
int P[1001];
int find() {
int big = 0; // 최대 수익
int bigIdx = 0; // 최대 수익을 내는 가격
for (int i = 0; i < M; i++) {
int num = P[i] * N; // 책정 가격
// 고객의 수가 달걀의 수보다 작을 때
if (M - i < N)
num = P[i] * (M - i);
if (big < num) {
big = num;
bigIdx = i;
}
}
printf("%d ", P[bigIdx]);
return big;
}
int main() {
scanf("%d %d", &N, &M);
for (int i = 0; i < M; i++)
scanf("%d", &P[i]);
sort(P, P + M);
printf("%d\n", find());
return 0;
}
입력 받은 고객 당 살 수 있는 가격의 목록P를 정렬했다.
int N, M; // N개의 달걀, 고객 M명
int P[1001];
int find() {
int big = 0; // 최대 수익
int bigIdx = 0; // 최대 수익을 내는 가격
for (int i = 0; i < M; i++) {
int num = P[i] * N; // 책정 가격
// 고객의 수가 달걀의 수보다 작을 때
if (M - i < N)
num = P[i] * (M - i);
if (big < num) {
big = num;
bigIdx = i;
}
}
printf("%d ", P[bigIdx]);
return big;
}
정렬된 P로 최대 수익과 이때 책정한 가격을 구했다. P[i]로 달걀을 팔았을 때의 가격을 num에 계산해서 저장한 뒤 이를 big과 비교해서 더 큰 것을 big에 저장하도록 했다. 이때 고객의 수가 달걀의 수보다 적어질 수 있기에 이를 위한 if문 또한 추가했다.
'백준 > C++' 카테고리의 다른 글
[Baekjoon/C++] 1755번 - 숫자놀이 (0) | 2023.05.20 |
---|---|
[Baekjoon/C++] 1758번 - 알바생 강호 (0) | 2023.05.19 |
[Baekjoon/C++] 10798번 - 세로읽기 (0) | 2023.05.10 |
[Baekjoon/C++] 10825번 - 국영수 (0) | 2023.05.07 |
[Baekjoon/C++] 1748번 - 수 이어 쓰기 1 (0) | 2023.05.06 |