题目速递:http://codeforces.com/gym/102500/problem/E
题解:注意一下精度
原本想着,输入数字都带两位小数,然后来加加减减,应该不会出现精度错误,结果是我本来就想错了。
计算机是用二进制来存的数据,因而浮点数都难免带有误差,比如0.9虽然只有一位小数,但转成2进制是无限循环小数0.1110011001100110011…。
故而原来想法仍停留在十进制,过于想当然。本身存在计算机内的带有误差的浮点数通过加加减减得出来的ans_1,肯定和本应有的答案值ans(用十进制运算后的结果化成二进制)之间不等。
解法1:【此题esp小于等于1e-2即可】
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <cmath>
#define N 100005
#define ll long long
using namespace std;
#define esp 1e-2
double a[6];
int cmp(double k){
if(k>esp)return 1;
else if(k<-esp)return -1;
return 0;
}
int main()
{
for(int i=0;i<5;i++)cin>>a[i];
sort(a,a+4);
double sum;
sum=a[0]+a[1]+a[2];
if(cmp(3*a[4]-sum)==-1){
printf("impossible");
return 0;
}
sum = a[1]+a[2]+a[3];
if(cmp(3*a[4]-sum)>=0){
printf("infinite");
return 0;
}
double temp = a[4]*3-a[1]-a[2];
printf("%.2lf\n",temp);
}
解法2:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <cmath>
#define N 100005
#define ll long long
using namespace std;
#define esp 1e-2
double a[6];
int main()
{
int u,v;
for(int i=0;i<=4;i++){
scanf("%d.%d",&u,&v);
a[i]=u*100+v;
}
sort(a,a+4);
int sum=0;
sum=a[0]+a[1]+a[2];
if(sum>a[4]*3){
printf("impossible\n");
return 0;
}
sum=a[1]+a[2]+a[3];
if(sum<=a[4]*3){
printf("infinite\n");
return 0;
}
double ans=(a[4]*3-a[1]-a[2])*1.0/100;
printf("%.2f\n",ans);
}