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;
}