codeforces !Hasan

Mixed Dimensions Onsite Round will host N contestants this year.

Moath and Saif have been preparing the contest hall, Moath needs X minutes to set up a computer for the contest, while Saif needs Yminutes to set up a computer. Each one of them works separately on one computer at a time.

Hasan is concerned they won't finish setting up the PCs in time, can you help Hasan figure out the minimum time required by Moath and Saif to set up all N PCs for the contest?

Input

The input contains 3 integers, N, X, and Y (1 ≤ N, X, Y ≤ 109), the number of PCs to set up, the amount of minutes Moath needs to set up a computer, and the amount of minutes Saif needs to set up a computer, respectively.

Output

On a single line, print one integer, the minimum number of minutes required by Moath and Saif to set up all the PCs for the contest.

Examples

input

5 3 4

output

9

input

100 10 1

output

91
———————————————————————————————————————————————————————————— 说一说今天的雪崩经历……这道题是十分的令人崩溃啊,wa了23发终于过了好吧,堪称励志。
  就是说有n个电脑,甲能a分钟修1个,乙能b分钟修一个,问最少多少时间修完
  先拿到题看,嗯,容易啊,就是对于,反正ab一直在做,瞎搞搞就好了么,然后队友就给了我一个公式:n*a*b/(a+b),结果可想而知,爆int了。
  然后发现了问题,改成longlong,然后就发现了最严重的问题……这个结果,double装不下……不下……下……
  瞬间懵逼。
  当时学弟还在车上,然后过来以后讲了下方法,事实上已经快要正确了,结果自己加了个特判……然后挖了个坑自己跳进去了。
  悲剧啊……
————————————————————————————————————————————————————————————
  嘛,这道题两种解法,一种是我们假设这个行为在某个时间结束,那么结束的时间总是固定的吧,然后我们假设在这个结束时间甲修了x个,那么乙就修了n-x,那公式是这样的:a*x=b(n-x),然后把这个方程式解出来,x可能是个小数,因为甲修完x个的时候可能乙没东西修了,但是从公式上来说乙是要修到一半的。
  那么有了这个小数,问题就变成了最后一个东西是甲修还是乙修,讨论一下就好了
  第二种解法比较计算机思维,就是既然放不下,那我也不放了,直接用二分搜索查找答案,250ms,log2 (1023)的复杂度也不过23/log102,轻松愉快的就找到了目标,当然过程得讨论一下,就是如果当前的时间是够的,那么rig=mid,如果当前不够,就lef=mid+1,这样最终会变成lef==rig的情况,然后直接输出就好啦。
——————————————————————code version 1——————————————————————————————
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
#include<vector>
#define V 100+10
#define E 10000+10
#define ll long long
const int INF=0x3f3f3f3f;
using namespace std;
ll mina=INF,shi;
int main()
{
	ll n;
	ll a,b,c,d;
	ll x,y;
	cin>>n>>a>>b;
	c=min(a,b);d=max(a,b);
	/*if(d==c){
	if(n%2==0)cout<<n*c/2<<endl;
	else cout<<(n/2+1)*c<<endl;
	}*/

	y=d*n/(c+d)+1;
	if(y>n)cout<<c*n<<endl;
	else {
		for(x=y;x>=0;x--){
			if(c*x<d*(n-x)){
				mina=min(c*(x+1),d*(n-x));
				break;
			}
		}
	    cout<<mina<<endl;
	}






}
————————————————————version 2—————————————————————————————————
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<queue>
#include<climits>
#include<map>
#include<stack>
#include<list>
#define file_in freopen("input.txt","r",stdin)
#define MAX 8000
#define HASH 100019
using namespace std;
#define ll long long
#define FF(x,y) for(int i=x;i<y;i++)
int main() {
	ll n, a, b;
	cin >> n >> a >> b;
	ll lef = 1;
	ll rig = 1e23;
	while (1)
	{
		ll mid = (lef + rig) >> 1;
		if (mid / a + mid / b >= n){
			rig = mid;
		}
		else {
			lef = mid+1;
		}
		if (lef >= rig)
		{
			cout << lef << endl;
			return 0;
		}
	}
	
	
	

}
 

转载于:https://www.cnblogs.com/stultus/p/6540198.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值