[UOJ 12]猜数
2017-07-31 20:21
323 查看
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\sqrt{ab}=2\sqrt{n}=2\sqrt{lg}$(当且仅当$a=b$取等)。由于$a,b≥g$,显然可以取等,满足。
对于最大值,由于$a+b≥2\sqrt{lg}$,我们记$f(x)=a+b={n\over b}+b$,显然在$(0,\sqrt n]$是单调递减的。由于$b≥g$,故在$b=g$处取最大值。
综上最小值为$2\sqrt{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$保平安了……
#include<set> #include<map> #include<ctime> #include<cmath> #include<queue> #include<stack> #include<cstdio> #include<string> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define LL long long #define RE register #define IL inline using namespace std; LL a,b; int t; int main() { cin>>t; while (t--) {scanf("%lld%lld",&a,&b); printf("%lld %lld\n",2*(LL)sqrt(b/a)*a,a+b);} return 0; }
相关文章推荐
- UOJ 12 猜数
- UOJ 12|【UER #1】猜数|数学
- UOJ 12 [UER #1]猜数
- uoj problem 12 猜数
- UOJ 12 猜数 数学题
- UOJ【UR #12】实验室外的攻防战
- UOJ180 【UR #12】实验室外的攻防战
- UOJ 180【UR #12】实验室外的攻防战
- 【BigHereo 12】-----The First Half Of My 2017
- 51nod算法马拉松12
- PAT乙级真题及训练集(12)--1028. 人口普查(20)
- PowerDesiner 12 最新下载(测试可下)
- 算法导论-12.动态规划-下
- 笔试笔记(12)
- QT12 How to open a new window after successful Login
- Java课程设计 猜数游戏团队博客
- 经典面试问题:12小球问题算法(源码)
- Chrome 最小字体12px
- font简写:body{font:12px/15px Arial}
- Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建