电费结算(electric)
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
输出仅一行一个整数,代表你单独算需要付的钱。数据保证解唯一。
Sample Input
1100 300
Sample Output
350
Data Constraint
Hint
20%的数据,A和B都不超过10^6。
100%的数据,1 ≤ A, B ≤ 10^9。
.
.
.
.
.
.
分析
先看懂是如何收费的,根据A反算出总电费
再二分出答案计算检验
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int b,df=0;
int js(int x)
{
int w=0,a=x,p=2;
if (x>100)
{
w+=2*100;a-=100;p=3;
}
if (x>10000)
{
w+=3*9900;a-=9900;p=5;
}
if (x>1000000)
{
w+=5*990000;a-=990000;p=7;
}
w+=a*p;
return w;
}
int ef(int l,int r)
{
while (l<=r)
{
int mid=(l+r)/2;
int a1=js(mid),b1=js(df-mid);
if (a1-b1==b) return b1; else
if (a1-b1<b) l=mid+1; else
if (a1-b1>b) r=mid-1;
}
}
int main()
{
int a;
scanf("%d%d",&a,&b);
int p=2;
if (a>2*100)
{
df+=100;a-=200;p=3;
}
if (a>3*9900)
{
df+=9900;a-=3*9900;p=5;
}
if (a>5*990000)
{
df+=990000;a-=5*990000;p=7;
}
df+=a/p;
int ans;
ans=ef(0,df);
printf("%d",ans);
return 0;
}