AtCoder 로그: 0022 - ABC 210 A
문제: ABC 210 A - Cabbages
문제문
타카하시 군은 양배추 가게에 왔습니다.
양배추 가게에서는 양배추를 $1$ 개 $X$ 엔으로 구입할 수 있습니다.
그러나 양배추를 $A$ 개보다 많이 사는 경우, $A+1$ 개째 이후에 구입하는 양배추에 대해서는 $1$ 개 $Y$ 엔으로 살 수 있습니다. (여기서 $Y타카하시 군이 양배추를 $N$ 개 사는데 필요한 금액을 출력해 주세요.
제약
・$1\le N\le 10^5$
・$1\le A\le 10^5$
・$1\le Y < X\le 100$
・입력은 모두 정수
답변 1 (AC)
문제의 내용을 올바르게 이해할 수 있다면 그리 어렵지 않을 것입니다. 구입하는 양배추의 개수 n 가 역치의 a 보다 큰지 어떤지를 판단해, 각각의 경우의 가격을 계산해 가게 됩니다. n 이 a 보다 큰 경우, 최초의 a 개의 단가는 x 엔, 나머지의 n-a 개의 단가는 y 엔이 되는 것에 주의가 필요합니다. 코드는 다음과 같습니다. 내가 제출한 코드 도 같은 정책이었습니다.
abc210a-1.cpp#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, x, y;
cin >> n >> a >> x >> y;
if ( n<a ) {
cout << x*n << endl;
} else {
cout << x*a+y*(n-a) << endl;
}
}
답변 2 (AC)
양배추의 구입 개수 n 을 가로축, 합계 금액 Cost 를 세로축으로 하여 그래프를 그리면 다음과 같이 됩니다. 구입 개수가 a개 이내이면, 그래프는 Cost=x*n 라고 하는 (원점을 통과한다) 직선이 됩니다 (왼쪽의 굵은 실선). 구입 개수가 a개를 넘었을 경우, 그래프는 Cost=x*a+y*(n-a) 라고 하는 직선(오른쪽의 굵은 실선)이 됩니다. 각각의 그래프를 연장하면 점선부가 나타나므로, 양배추의 구입 개수 n에 의하지 않고, 합계 금액은 항상 x*n 과 x*a+y*(n-a)가 적은 쪽이 되어 있는 것을 알 수 있습니다. 이 고찰을 사용하면 if 문으로 구분할 필요가 없으며 다음과 같은 간단한 코드가 됩니다.
abc210a-2.cpp#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, x, y;
cin >> n >> a >> x >> y;
cout << min( x*n, x*a+y*(n-a) ) << endl;
}
조사한 것
AtCoder 해설 → 공식 해설
답변 1과 같은 정책이었습니다. 또한, n=a 의 경우는 어느 쪽의 식을 사용해도 합계 금액은 동일하게 되므로, if 문의 n<=a 는 n링크
이전 기사 →AtCoder 로그: 0021 - ABC 210에 가입했습니다.
다음 기사 → AtCoder 로그: 0023 - ABC 210 B
Reference
이 문제에 관하여(AtCoder 로그: 0022 - ABC 210 A), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/RoadLynton/items/5730d21e57a52cf7ca3c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
제약
・$1\le N\le 10^5$
・$1\le A\le 10^5$
・$1\le Y < X\le 100$
・입력은 모두 정수
답변 1 (AC)
문제의 내용을 올바르게 이해할 수 있다면 그리 어렵지 않을 것입니다. 구입하는 양배추의 개수 n 가 역치의 a 보다 큰지 어떤지를 판단해, 각각의 경우의 가격을 계산해 가게 됩니다. n 이 a 보다 큰 경우, 최초의 a 개의 단가는 x 엔, 나머지의 n-a 개의 단가는 y 엔이 되는 것에 주의가 필요합니다. 코드는 다음과 같습니다. 내가 제출한 코드 도 같은 정책이었습니다.
abc210a-1.cpp#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, x, y;
cin >> n >> a >> x >> y;
if ( n<a ) {
cout << x*n << endl;
} else {
cout << x*a+y*(n-a) << endl;
}
}
답변 2 (AC)
양배추의 구입 개수 n 을 가로축, 합계 금액 Cost 를 세로축으로 하여 그래프를 그리면 다음과 같이 됩니다. 구입 개수가 a개 이내이면, 그래프는 Cost=x*n 라고 하는 (원점을 통과한다) 직선이 됩니다 (왼쪽의 굵은 실선). 구입 개수가 a개를 넘었을 경우, 그래프는 Cost=x*a+y*(n-a) 라고 하는 직선(오른쪽의 굵은 실선)이 됩니다. 각각의 그래프를 연장하면 점선부가 나타나므로, 양배추의 구입 개수 n에 의하지 않고, 합계 금액은 항상 x*n 과 x*a+y*(n-a)가 적은 쪽이 되어 있는 것을 알 수 있습니다. 이 고찰을 사용하면 if 문으로 구분할 필요가 없으며 다음과 같은 간단한 코드가 됩니다.
abc210a-2.cpp#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, x, y;
cin >> n >> a >> x >> y;
cout << min( x*n, x*a+y*(n-a) ) << endl;
}
조사한 것
AtCoder 해설 → 공식 해설
답변 1과 같은 정책이었습니다. 또한, n=a 의 경우는 어느 쪽의 식을 사용해도 합계 금액은 동일하게 되므로, if 문의 n<=a 는 n링크
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, x, y;
cin >> n >> a >> x >> y;
if ( n<a ) {
cout << x*n << endl;
} else {
cout << x*a+y*(n-a) << endl;
}
}
양배추의 구입 개수 n 을 가로축, 합계 금액 Cost 를 세로축으로 하여 그래프를 그리면 다음과 같이 됩니다. 구입 개수가 a개 이내이면, 그래프는 Cost=x*n 라고 하는 (원점을 통과한다) 직선이 됩니다 (왼쪽의 굵은 실선). 구입 개수가 a개를 넘었을 경우, 그래프는 Cost=x*a+y*(n-a) 라고 하는 직선(오른쪽의 굵은 실선)이 됩니다. 각각의 그래프를 연장하면 점선부가 나타나므로, 양배추의 구입 개수 n에 의하지 않고, 합계 금액은 항상 x*n 과 x*a+y*(n-a)가 적은 쪽이 되어 있는 것을 알 수 있습니다. 이 고찰을 사용하면 if 문으로 구분할 필요가 없으며 다음과 같은 간단한 코드가 됩니다.
abc210a-2.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, x, y;
cin >> n >> a >> x >> y;
cout << min( x*n, x*a+y*(n-a) ) << endl;
}
조사한 것
AtCoder 해설 → 공식 해설
답변 1과 같은 정책이었습니다. 또한, n=a 의 경우는 어느 쪽의 식을 사용해도 합계 금액은 동일하게 되므로, if 문의 n<=a 는 n링크
Reference
이 문제에 관하여(AtCoder 로그: 0022 - ABC 210 A), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RoadLynton/items/5730d21e57a52cf7ca3c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)