Problem:
Score : 300 points

Problem Statement

You've come to your favorite store Infinitesco to buy some ice tea.

The store sells ice tea in bottles of different volumes at different costs.
Specifically, a 0.25-liter bottle costs Q yen, a 0.5-liter bottle costs H yen, a 1-liter bottle costs S yen, and a 2-liter bottle costs D yen.
The store has an infinite supply of bottles of each type.

You want to buy exactly N liters of ice tea. How many yen do you have to spend?

Constraints

1 \leq Q, H, S, D \leq 10^8

1 \leq N \leq 10^9

All input values are integers.

Input

Input is given from Standard Input in the following format:

Q H S D
N

Output

Print the smallest number of yen you have to spend to buy exactly N liters of ice tea.

Sample Input 1

20 30 70 90
3

Sample Output 1

150

Buy one 2-liter bottle and two 0.5-liter bottles. You'll get 3 liters for 90 + 30 + 30 = 150 yen.

Sample Input 2

10000 1000 100 10
1

Sample Output 2

100

Even though a 2-liter bottle costs just 10 yen, you need only 1 liter.
Thus, you have to buy a 1-liter bottle for 100 yen.

Sample Input 3

10 100 1000 10000
1

Sample Output 3

40

Now it's better to buy four 0.25-liter bottles for 10 + 10 + 10 + 10 = 40 yen.

Sample Input 4

12345678 87654321 12345678 87654321
123456789

Sample Output 4

1524157763907942

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define int long long
#define P(x) cout << x << endl
#define D(x) P(#x << ": " << x)
#define F(i,n) for(int i = 0; i < (int)(n); ++i)
#define DEC(i,n) for(int i = (int)(n); --i >= 0;)
#define S(s) (int)((s).size())
#define ALL(v) v.begin(), v.end()
#define V vector
#define pb push_back
#define mt make_tuple
using namespace std;

#define INF 1000000000

int n;
int dist(int i, int j) {
	if(i > j) swap(i,j);
	return min(j-i, i+n-j);
}

signed main() {
	string a,b; cin >> a >> b;
	n = S(a);

	bool a1 = false, b1 = false;
	F(i,n) {
		if(a[i] == '1') a1 = true;
		if(b[i] == '1') b1 = true;
	}
	if(a1 && !b1) {
		P(-1);
		exit(0);
	}

	int l[n],r[n];
	fill(l,l+n,INF);
	fill(r,r+n,INF);

	F(i,n) {
		for(int j = 0; j <= i; ++j) {
			if(b[j] == '1') {
				l[i] = min(l[i],i-j);
				r[i] = min(r[i],j+n-i);
			}
		}
		for(int j = i; j < n; ++j) {
			if(b[j] == '1') {
				l[i] = min(l[i],i+n-j);
				r[i] = min(r[i],j-i);
			}
		}
	}

	int ans = INF;

	F(k,n) {
		int ch = 0, leftmost = 0, rightmost = 0;
		F(j,n) {
			if(a[j] == '0' && b[(j+k)%n] == '1') {
				++ch;
			}
			if(a[j] == '1' && b[(j+k)%n] == '0') {
				++ch;
				leftmost = max(leftmost, l[j]);
				rightmost = max(rightmost, r[j]);
			}
		}

		int shift = INF;
		shift = min(shift, leftmost + dist(n-leftmost,k));
		shift = min(shift, rightmost + dist(rightmost,k));

		ans = min(ans,ch+shift);
	}
	P(ans);
}