Buy the String (Codeforces 1440A)
Tags: Math, implementation

You are given four integers $$$n$$$, $$$c_0$$$, $$$c_1$$$ and $$$h$$$ and a binary string $$$s$$$ of length $$$n$$$.A binary string is a string consisting of characters $$$0$$$ and $$$1$$$.You can change any character of the string $$$s$$$ (the string should be still binary after the change). You should pay $$$h$$$ coins for each change.After some changes (possibly zero) you want to buy the string. To buy the string you should buy all its characters. To buy the character $$$0$$$ you should pay $$$c_0$$$ coins, to buy the character $$$1$$$ you should pay $$$c_1$$$ coins.Find the minimum number of coins needed to buy the string.

Input: The first line contains a single integer $$$t$$$ ($$$1 \leq t \leq 10$$$) — the number of test cases. Next $$$2t$$$ lines contain descriptions of test cases.The first line of the description of each test case contains four integers $$$n$$$, $$$c_{0}$$$, $$$c_{1}$$$, $$$h$$$ ($$$1 \leq n, c_{0}, c_{1}, h \leq 1000$$$).The second line of the description of each test case contains the binary string $$$s$$$ of length $$$n$$$.

Output: For each test case print a single integer — the minimum number of coins needed to buy the string.

Note: In the first test case, you can buy all characters and pay $$$3$$$ coins, because both characters $$$0$$$ and $$$1$$$ costs $$$1$$$ coin.In the second test case, you can firstly change $$$2$$$-nd and $$$4$$$-th symbols of the string from $$$1$$$ to $$$0$$$ and pay $$$2$$$ coins for that. Your string will be $$$00000$$$. After that, you can buy the string and pay $$$5 \cdot 10 = 50$$$ coins for that. The total number of coins paid will be $$$2 + 50 = 52$$$.

Sample Inputs:
6
3 1 1 1
100
5 10 100 1
01010
5 10 1 1
11111
5 1 10 1
11111
12 2 1 10
101110110101
2 100 1 10
00

Sample Outputs:
3
52
5
10
16
22

Solution (Python):
def read():
    """"""
    (n, c0, c1, h) = map(int, input().split())
    s = list(map(int, list(input())))
    return (n, c0, c1, h, s)

def solve(n, c0, c1, h, s):
    """"""
    pay = 0
    for i in range(n):
        if s[i] == 1:
            pay += min(c0 + h, c1)
        else:
            pay += min(c1 + h, c0)
    return pay
t = int(input())
for i in range(t):
    print(solve(*read()))

Solution (Python):
for _ in range(int(input())):
    (n, c0, c1, h) = map(int, input().split())
    s = input()
    count_0 = s.count('0')
    count_1 = s.count('1')
    print(min(c0 * count_0 + c1 * count_1, count_0 * h + n * c1, count_1 * h + n * c0))

Solution (Python):
for i in range(int(input())):
    (n, c0, c1, h) = map(int, input().split())
    s = input()
    a = s.count('1') * c1
    b = s.count('0') * c0
    c = a + b
    if c1 > c0:
        ans1 = s.count('1') * h
        ab = ans1 + n * c0
        print(min(c, ab))
    elif c1 < c0:
        ans1 = s.count('0') * h
        ab = ans1 + n * c1
        print(min(c, ab))
    elif c1 == c0:
        print(c)