BILL - Hóa đơn tiền điện

Tác giả: flashmt

Ngôn ngữ: C++

#include <iostream>
#include <algorithm>
using namespace std;

long long calcVND(long long u)
{
	if (u <= 100) return u * 200;
	if (u <= 10000) return calcVND(100) + (u - 100) * 300;
	if (u <= 1000000) return calcVND(10000) + (u - 10000) * 500;
	return calcVND(1000000) + (u - 1000000) * 700;
}

long long calcKWh(long long u)
{
	if (calcVND(100) >= u) return u / 200;
	if (calcVND(10000) >= u) return 100 + (u - calcVND(100)) / 300;
	if (calcVND(1000000) >= u) return 10000 + (u - calcVND(10000)) / 500;
	return 1000000 + (u - calcVND(1000000)) / 700;
}

int main()
{
	long long x, y;
	cin >> x >> y;
	
	long long total = calcKWh(x), low = 0, high = total / 2, ans = -1;
	while (low <= high)
	{
		long long mid = (low + high) / 2;
		long long dif = calcVND(total - mid) - calcVND(mid);
		if (dif == y)
		{
			ans = mid; break;
		}
		if (dif < y) high = mid - 1;
		else low = mid + 1;
	}
	
	cout << calcVND(ans) << endl;
}

Download