码迷,mamicode.com
首页 > 其他好文 > 详细

[UOJ 12]猜数

时间:2017-07-31 20:47:53      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:ndk   pdm   qt4   tca   jsm   ipo   vps   awl   ict   

Description

技术分享

Input

技术分享

Output

技术分享

Sample Input1

1
1 4

Sample Output1

4 5

Sample Explanation1

技术分享

Sample Input2

1
2 8

Sample Output2

8 10

HINT

技术分享

题解

此题巨坑无比。不要用unsigned/cin。

其次a,b是g的倍数的意思是“对于输入的g,a,b一定要是g的倍数”,而不是“对于所有a,b,输入的g满足a,b是g的倍数”(这种理解其实直接就是g=1,而输入并不保证g=1)。

我们有n=l×g。那么我们分开来讨论:

对于最小值,由均值不等式:a+b≥2√ab=2√n=2√lg(当且仅当a=b取等)。由于a,b≥g,显然可以取等,满足。

对于最大值,由于a+b≥2√lg,我们记f(x)=a+b=n/b+b,显然在(0,√n]是单调递减的。由于b≥g,故在b=g处取最大值。

综上最小值为2√lg,最大值为l+g。

精度问题
有人可能会写:
ans_min = (long long)sqrt((double)g × l);
这样会被卡精度,因为double大概只有15位10进制有效数字。只能得到60分。
解决方法是:
ans_min = (long long)sqrt(l / g) × g;
当然有人可能直接long double保平安了……

 1 #include<set>
 2 #include<map>
 3 #include<ctime>
 4 #include<cmath>
 5 #include<queue>
 6 #include<stack>
 7 #include<cstdio>
 8 #include<string>
 9 #include<vector>
10 #include<cstring>
11 #include<cstdlib>
12 #include<iostream>
13 #include<algorithm>
14 #define LL long long
15 #define RE register
16 #define IL inline
17 using namespace std;
18 
19 LL a,b;
20 int t;
21 
22 int main()
23 {
24     cin>>t;
25     while (t--)
26         {scanf("%lld%lld",&a,&b);
27             printf("%lld %lld\n",2*(LL)sqrt(b/a)*a,a+b);}
28     return 0;
29 }

 

[UOJ 12]猜数

标签:ndk   pdm   qt4   tca   jsm   ipo   vps   awl   ict   

原文地址:http://www.cnblogs.com/NaVi-Awson/p/7265190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!