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

Tác giả: skyvn97

Ngôn ngữ: C++

#include<stdio.h>
typedef unsigned long long ull;
ull x,y,l,m,r,a,b;
ull cost(ull a)
{
    if (a<=100) return (200*a);
    if (a<=10000) return (300*a-10000);
    if (a<=1000000) return (500*a-2010000);
    return (700*a-202010000);
}
int main(void)
{
    scanf("%llu",&x);
    scanf("%llu",&y);
    l=0;
    r=x;
    while (true)
          {
           if (l==r)              
              {
               if (cost(l)==x) {a=l;break;}
              }
           if (r-l==1)
              {
               if (cost(l)==x) {a=l; break;}
               if (cost(r)==x) {a=r; break;}
              }
           m=(l+r)/2;
           if (cost(m)==x)
              {
               a=m;
               break;
              }
           if (cost(m)>x) r=m-1;
           if (cost(m)<x) l=m+1;              
          }
    l=0;
    r=a/2;
    while (true)
          {
           if (l==r)
              {
               if (cost(a-l)-cost(l)==y) {b=l;break;}
              }
           if (r-l==1)
              {
               if (cost(a-l)-cost(l)==y) {b=l;break;}
               if (cost(a-r)-cost(r)==y) {b=r;break;}
              }
           m=(l+r)/2;
           if (cost(a-m)-cost(m)==y)
              {
               b=m;
               break;
              }
           if (cost(a-m)-cost(m)>y) l=m+1;
           if (cost(a-m)-cost(m)<y) r=m-1;
          }
    printf("%llu",cost(b));
}

Download