传送门:
http://codeforces.com/contest/621/problem/D
double 1.07*10的308位
long double 简直神器 4900多位
此题log里面会卡负数,因此可以用long double 然后一个log 就可以了!!
今天想叉掉一个B题暴力写的,然后输出文件手点的太快,导致数据没写完,最后invalid input 简直可惜啊!!!!
#include
#include
#define double long double
using namespace std;
double get2(double x, double y, double z) {
return y * z * log(x);
}
const double eps = 1e-10;
bool bigger(double a, double b) {
return a - b > 0;
}
bool equal(double a, double b) {
return abs(a - b) double best;
int best_pos;
int pos;
void try1(double x, double y, double z, bool sure = false) {
++ pos;
double val = pow(y, z) * log(x);
if (bigger(val, best) || sure) {
best = val;
best_pos = pos;
}
}
void try2(double x, double y, double z, bool sure = false) {
++ pos;
double val = y * z * log(x);
if (bigger(val, best) || sure) {
best = val;
best_pos = pos;
}
}
int main()
{
double x, y, z;
cin >> x >> y >> z;
try1(x, y, z, true);
try1(x, z, y);
try2(x, y, z);
try2(x, z, y);
try1(y, x, z);
try1(y, z, x);
try2(y, x, z);
try2(y, z, x);
try1(z, x, y);
try1(z, y, x);
try2(z, x, y);
try2(z, y, x);
不过题解给的思想还是蛮给力的,毕竟long double
能解决的位数也是有限的,属于是水过,标解是这样的,我们还是取双log,分成三类,
1.如果a,b,c都是大于1的,那么好办
2.如果至少有一个是大于1的,那么就要把大于1的作为底,因为如果把小于1的做底,那么结果永远是小于1的,那么我们就可以不去比较那些会使得值为负数的表达式,就ok了
3.如果三个数都小于1的话,那么我们可以将底数取倒数,然后就比较最小值就ok了,简直机智啊!orz