电费结算(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;
}
posted @ 2019-03-23 14:46  银叶草  阅读(418)  评论(0编辑  收藏  举报
Live2D