电费结算_纪中3018_二分

55 篇文章 0 订阅

Description


WZK最近靠租房发家致富了。作为WZK老同学的你也要租房,于是WZK决定不要房租,但是电费还得付。以下是用电价格:
这里写图片描述
举个例子吧。如果你用电为10123千瓦时,那么要付2 * 100 + 3 * 9900 + 5 * 123 = 30515块钱(好贵)。
到结算电费的日子了,可是WZK家里只有一个总电表,也就是统计你和WZK总共用的电量。但是WZK有办法告诉你以下信息:

1).如果按照总电表来看要交给供电局的钱A。(也就是两个人用电量加起来一起算钱)

2).你和WZK如果分开付的话,你们付的钱的差值B。

现在你想知道如果你单独算钱的话,需要付多少钱。当然,你的用电量不会比WZK多。

举个例子:如果你们一起算钱要付1100,并且如果分开来算,你们的差值是300的话,那么你用了150kwh,WZK用了250kwh。让我们来验算一下:你们一共用电400kwh,所以要付2 * 100 + 3 * 300 = 1100,你单独要付2 * 100 + 3 * 50 = 350,WZK单独要付2 * 100 + 3 * 150 = 650。所以最后,你只需要告诉我你单独要付350元。

Input


输入仅一行,包含两个整数A和B(1 ≤ A, B ≤ 10^9),含义同上。 输出描述: 输出仅一行一个整数,代表你单独算需要付的钱。数据保证解唯一。

Output


输出仅一行一个整数,代表你单独算需要付的钱。数据保证解唯一。

Hint


20%的数据,A和B都不超过10^6。

100%的数据,1 ≤ A, B ≤ 10^9。

Analysis


又是一道本以为切掉却wa了的氵题

题目给出了总的话费,那么总耗电是可求的(显然)
二分用电,判断一下价格差

Code


既然是氵题我就写得丑一点了

#include <stdio.h>
using namespace std;
int v[4]={2,3,5,7};
int cal(int x)
{
    int tmp=0,pp=x,u=0;
    if (x>100)
        tmp+=2*100,u=1,pp-=100;
    if (x>10000)
        tmp+=3*9900,u=2,pp-=9900;
    if (x>1000000)
        tmp+=5*990000,u=3,pp-=990000;
    return tmp+pp*v[u];
}
int main()
{
    int a,b,p=0,e=0;
    scanf("%d%d",&a,&b);
    if (a>2*100)
        e+=100,a-=200,p=1;
    if (a>3*9900)
        e+=9900,a-=3*9900,p=2;
    if (a>5*990000)
        e+=990000,a-=5*990000,p=3;
    e+=a/v[p];
    int l=0,r=e;
    while (l<=r)
    {
        int mid=(l+r)>>1,tmp_A=cal(mid),tmp_B=cal(e-mid);
        if (tmp_A-tmp_B==b)
        {
            printf("%d\n",tmp_B);
            return 0;
        }
        else
            if (tmp_A-tmp_B<b)
                l=mid+1;
            else
                if (tmp_A-tmp_B>b)
                    r=mid-1;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值