电费结算 纪中3018 二分

来源:互联网 发布:黑客python 编辑:程序博客网 时间:2024/04/30 04:20

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

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

分析

可以算出一共用了多少电,然后二分一下答案水的要死,但却打错了,也是蛋疼

代码

更难看的c++

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;long a,b,c;long price(int x){    if (x<=100)        return x*2;    else        if (x<=10000)            return 200+(x-100)*3;        else            if (x<=1000000)                return 200+29700+(x-10000)*5;            else                return 200+29700+990000*5+(x-1000000)*7;}void init(){    scanf("%d%d",&a,&b);    if (a<=200)        c=a/2;    else        if (a<=29900)            c=100+(a-200)/3;        else            if (a<=5249000)                c=10000+(a-29900)/5;            else                c=1000000+(a-4979900)/7;}int main(){    init();    long r,l,mid;    mid=c/2;    r=1; l=c;    while (price(mid)-price(c-mid)!=b)    {        if (price(mid)-price(c-mid)>b)        {            l=mid;            mid=(l+r)/2;        }        else        {            r=mid;            mid=(l+r)/2;        }    }    printf("%d",price(c-mid));    return 0;}
0 0