寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C #Volume3_0383 Heat Strokes

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題
 この夏は記録的な猛暑に見舞われています。
 あなたは、熱中症を予防するために、最寄りのスーパーで必要な量の水をまとめ買いすることにしました。
 このスーパーでは、1リットルと500ミリリットルの2種類のボトルに入った水が、それぞれの価格で売られています。
 あなたは、必要な量ぴったり買う方法がない、または合計金額が安くなるなら、必要な量より多く買おうと思っています。
 2種類のボトルの価格と必要な水の量を入力とし、必要な量以上の水を、できるだけ安くなるように買ったときの合計金額を求めるプログラムを作成せよ。

・入力される値
 入力は以下の形式で与えられる。
   A B X
 1行に1リットル入りボトルの価格A (1≤A≤1000)、500ミリリットル入りボトルの価格B (1≤B≤1000)、必要な水の量X (1≤X≤20000)が与えられる。
 入力はすべて整数であり、水の量はミリリットル単位で与えられる。

・期待する出力
 合計金額を1行に出力する。

僕が作成、提出したコードは、以下のとおりです。

/*
 Volume3_0383 Heat Strokes
 http://judge.u-aizu.ac.jp/
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
int main(void){
    int A,B,X,ans;
    scanf("%d %d %d",&A,&B,&X);
    if(X%500!=0){
        X+=500-X%500;
    }
    int a=0,b=0;
    if(A<B){
        if(X%1000>0){
            a=X/1000+1;
        }else{
            a=X/1000;
        }
    }else if(A>2*B){
        b=X/500;
    }else{
        a=X/1000;
        X%=1000;
        b=X/500;
    }
    ans=A*a+B*b;
    printf("%d\n",ans);
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
Volume3_0383 Heat Strokes