【17.00%】【codeforces 621D】Rat Kwesh and Cheese

来源:互联网 发布:北外网络教育登录 编辑:程序博客网 时间:2024/06/14 23:58

time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Wet Shark asked Rat Kwesh to generate three positive real numbers x, y and z, from 0.1 to 200.0, inclusive. Wet Krash wants to impress Wet Shark, so all generated numbers will have exactly one digit after the decimal point.

Wet Shark knows Rat Kwesh will want a lot of cheese. So he will give the Rat an opportunity to earn a lot of cheese. He will hand the three numbers x, y and z to Rat Kwesh, and Rat Kwesh will pick one of the these twelve options:

a1 = xyz;
a2 = xzy;
a3 = (xy)z;
a4 = (xz)y;
a5 = yxz;
a6 = yzx;
a7 = (yx)z;
a8 = (yz)x;
a9 = zxy;
a10 = zyx;
a11 = (zx)y;
a12 = (zy)x.
Let m be the maximum of all the ai, and c be the smallest index (from 1 to 12) such that ac = m. Rat’s goal is to find that c, and he asks you to help him. Rat Kwesh wants to see how much cheese he gets, so he you will have to print the expression corresponding to that ac.

Input
The only line of the input contains three space-separated real numbers x, y and z (0.1 ≤ x, y, z ≤ 200.0). Each of x, y and z is given with exactly one digit after the decimal point.

Output
Find the maximum value of expression among xyz, xzy, (xy)z, (xz)y, yxz, yzx, (yx)z, (yz)x, zxy, zyx, (zx)y, (zy)x and print the corresponding expression. If there are many maximums, print the one that comes first in the list.

xyz should be outputted as x^y^z (without brackets), and (xy)z should be outputted as (x^y)^z (quotes for clarity).

Examples
input
1.1 3.4 2.5
output
z^y^x
input
2.0 2.0 2.0
output
x^y^z
input
1.9 1.8 1.7
output
(x^y)^z

【题解】

200^200^200是无法接受的;
考虑取log之后再比较;->高中老师教过的方法我怎么就忘了呢。
然后200^200->1e460左右;但是在long double 前这都不算啥;
long double 最高到10^4932;
所以放心用吧;
另外如果取两次对数会失精度;
一大波WA在等着你;
取对数的时候加加减减小心点;
(或者取两次对数,给的x,y,z比较小的时候直接算.否则取两次对数?->考虑x小于1的时候直接乘,但是0.1 200 200 这样的数据没办法直接算,而两次log精度又不够,所以long double+只取一次log是最好的选择;)

#include <cstdio>#include <cmath>#include <set>#include <map>#include <iostream>#include <algorithm>#include <cstring>#include <queue>#include <vector>#include <stack>#include <string>#define lson L,m,rt<<1#define rson m+1,R,rt<<1|1#define LL long longusing namespace std;//const int MAXN = x;const int dx[5] = {0,1,-1,0,0};const int dy[5] = {0,0,0,-1,1};const double pi = acos(-1.0);long double x,y,z;long double ans[15];void input_LL(LL &r){    r = 0;    char t = getchar();    while (!isdigit(t)) t = getchar();    LL sign = 1;    if (t == '-')sign = -1;    while (!isdigit(t)) t = getchar();    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();    r = r*sign;}void input_int(int &r){    r = 0;    char t = getchar();    while (!isdigit(t)) t = getchar();    int sign = 1;    if (t == '-')sign = -1;    while (!isdigit(t)) t = getchar();    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();    r = r*sign;}int main(){    //freopen("F:\\rush.txt", "r", stdin);    cin>>x>>y>>z;    ans[1] = pow(y,z)*log(x);    ans[2] = pow(z,y)*log(x);    ans[3] = z*y*log(x);    ans[4] = ans[3];    ans[5] = pow(x,z)*log(y);    ans[6] = pow(z,x)*log(y);    ans[7] = x*z*log(y);    ans[8] = ans[7];    ans[9] = pow(x,y)*log(z);    ans[10] = pow(y,x)*log(z);    ans[11] = x*y*log(z);    ans[12] = ans[11];    int j = 1;    for (int i = 2;i <= 12;i++)        if (ans[j]<ans[i])            j = i;    switch (j)    {    case 1:        puts("x^y^z");        break;    case 2:        puts("x^z^y");        break;    case 3:        puts("(x^y)^z");        break;    case 4:        puts("(x^z)^y");        break;    case 5:        puts("y^x^z");        break;    case 6:        puts("y^z^x");        break;    case 7:        puts("(y^x)^z");        break;    case 8:        puts("(y^z)^x");        break;    case 9:        puts("z^x^y");        break;    case 10:        puts("z^y^x");        break;    case 11:        puts("(z^x)^y");        break;    case 12:        puts("(z^y)^x");        break;    }    return 0;}
0 0