AtCoder 로그: 0022 - ABC 210 A

5141 단어 C++AtCoder

문제: 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
  • 좋은 웹페이지 즐겨찾기