链接:http://www.patest.cn/contests/pat-a-practise/1011
输入:
W1 T1 L1
W2 T2 L2
W3 T3 L3
输出:
[min(W1,T1,L1)*min(W2,T2,L2)*min(W2,T2,L2)*0.65-1]*2
【分析】这个题目是4个题目中的第一题,难点应该是浮点数的精度问题
#include<cstdio>
#include<iostream>
#define INF 1e-10
using namespace std;
double _max(double a,double b,double c)
{
double aa=max(a,b);
aa=max(aa,c);
return aa;
}
int main()
{
// freopen("in.txt","r",stdin);
double a,b,c,tot=1;
for(int i=0; i<3; i++)
{
if(i)
printf(" ");
scanf("%lf%lf%lf",&a,&b,&c);
double aa=_max(a,b,c);
tot*=aa;
if(aa-a<INF&&aa-a>-INF)
printf("W");
if(aa-b>-INF&&aa-b<INF)
printf("T");
if(aa-c>-INF&&aa-c<INF)
printf("L");
}
tot=(tot*0.65-1)*2;
printf(" %.2lf\n",tot+0.0005);
return 0;
}
这种方法由于中间步骤比较多,导致误差较大,最后tot+0.0005来弥补精度损失,另外如果是tot+0.005就会WA,1.3+0.005就会保留两位小数就会变成1.31,有了误差。
#include<cstdio>
#include<iostream>
#define INF 1e-10
using namespace std;
int main()
{
// freopen("in.txt","r",stdin);
double a,b,c,tot=1;
double x[3];
for(int i=0; i<3; i++)
{
scanf("%lf%lf%lf",&a,&b,&c);
if(a>b&&a>c)
{
x[i]=a;
printf("W ");
}
else if(b>a&&b>c)
{
x[i]=b;
printf("T ");
}
else
{
x[i]=c;
printf("L ");
}
}
tot=(x[0]*x[1]*x[2]*0.65-1)*2;
printf("%.2lf\n",tot);
return 0;
}
这种方法中间步骤较少,误差小,也可以AC