Problem:
Problem A: Rental DVD Shop NEO

Problem

僕はレンタルDVDショップ、「NEO」でアルバイトを始めた。まずはこの店の料金システムを勉強することになった。

レンタルDVDは旧作、準新作、新作の3種類存在し、1本のレンタル料金がそれぞれ a 円、 b 円、 c 円である。
会計の際に以下に示すセットレンタルを複数回適用することができる。

まだセットレンタルを適用していないDVDを数本選ぶ。

選んだDVDの本数が d 本以上の場合、選んだDVDの合計金額が、 (選んだDVDの本数) * e 円を超える場合は、それらを (選んだDVDの本数) * e 円でレンタル出来る。

選んだDVDの本数が d 本未満の場合、選んだDVDの合計金額が d * e 円を超える場合は、それらを d * e 円でレンタル出来る。

上記に当てはまらない場合、選んだDVDは通常料金でレンタルとなる。

ここで僕はある問題に気づいた。セットレンタルはレジに通した時に自動的に適用されるのではなく、手動で適用しているのだ。これでは最適ではない（もっと安くなる余地がある）セットレンタルの適用をしてしまう可能性がある。これではクレームが発生しかねない。僕はクレーム対応が嫌いなので、セットレンタルを最適に適用した時の料金を計算するプログラムを作成することにした。

Input

入力は複数のデータセットからなる。
各データセットは以下で表される。
1行目は5つの整数 a , b , c , d , e がスペース区切りで与えられる。
2行目にはレンタル本数が与えられる。3つの整数 na , nb , nc がスペース区切りで与えられる。それぞれ旧作、準新作、新作のDVDの本数を表す。
入力の終わりは5つのゼロからなる。

a b c d e
na nb nc

Constraints

入力は以下の条件を満たす。

入力に含まれる値はすべて整数

0 < a < b < e < c ≤ 1000

0 < d ≤ 100000

0 ≤ na , nb , nc ≤ 100000

0 < na + nb + nc

データセットの数は100個以下

Output

各データセットにつき、セットレンタルを最適に適用した時の料金を1行に出力せよ。

Sample Input

70 100 340 4 200
1 1 4
70 100 340 4 200
0 1 3
70 100 340 4 200
1 1 2
0 0 0 0 0

Sample Output

970
800
800

Solution in C# (judge verdict: Accepted)

using static System.Math;
using System;

public class Hello
{
    public static void Main()
    {
        while (true)
        {
            string[] line = Console.ReadLine().Trim().Split(' ');
            var a = int.Parse(line[0]);
            var b = int.Parse(line[1]);
            var c = int.Parse(line[2]);
            var d = int.Parse(line[3]);
            var e = int.Parse(line[4]);
            if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0) break;
            line = Console.ReadLine().Trim().Split(' ');
            var na = int.Parse(line[0]);
            var nb = int.Parse(line[1]);
            var nc = int.Parse(line[2]);
            var ans = getAns(a, b, c, d, e, na, nb, nc);
            Console.WriteLine(ans);
        }
    }
    static int getAns (int a, int b, int c, int d , int e , int na, int nb, int nc)
    {
        var ncset = 0;
        if (nc >= d) { ncset = nc * e; nc = 0; }
        var pr1 = getPr1(a, b, c, d, e, na, nb, nc);
        var pr2 = getPr2(a, b, c, d, e, na, nb, nc);
        var pr3 = na * a + nb * b + nc * c;
        return Min(pr1, Min(pr2, pr3)) + ncset;
    }
    static int getPr1(int a, int b, int c, int d, int e, int na, int nb, int nc)
    {
        if (na + nb + nc < d) return int.MaxValue;
        var need = d - nc;
        if (nb >= need) return d * e + (nb - need) * b + na * a;
        else
        {
            var need2 = d - nc - nb;
            return d * e + (na - need2) * a;
        }
    }
    static int getPr2(int a, int b, int c, int d, int e, int na, int nb, int nc)
    {
        if (na + nb + nc < d) return d * e;
        var need = d - 1 - nc;
        if (nb >= need) return d * e + (nb - need) * b + na * a;
        else
        {
            var need2 = d  -1 - nc - nb;
            return d * e + (na - need2) * a;
        }
    }
}