hdu 2039一直WA

yyandlb 2010-07-29 05:47:33
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2039
#include<stdio.h>
#include<math.h>
int main()
{
int t;
int flag;
float a,b,c,max,min;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
flag=1;
scanf("%f %f %f",&a,&b,&c);
if(a+b<b+c)
{max=a+b;
if(max>a+c)
{
max=a+c;
}
}
else
{
max=b+c;
if(max>a+c)
{
max=a+c;
}
}

if(fabs(a-b)>fabs(b-c))
{min=fabs(a-b);
if(min<fabs(a-c))
{
min=fabs(a-c);
}
}
else
{
min=fabs(b-c);
if(min<fabs(a-c))
{
min=fabs(a-c);
}
}
if(a<=min||a>=max||b<=min||b>=max||b<=min||b>=max)
{flag=0;}

if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}
return 0;
}
请问是哪里出错了呢?
...全文
129 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyandlb 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 logiciel 的回复:]

找到一个反例:

14 7 8

计算出min为7,由于b<=min,输出错误的NO.因此用min判断不可行。
[/Quote]

原来是因为这个。。。。
yyandlb 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 paradin 的回复:]

#include<stdio.h>
int main()
{
double a,b,c;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%lf%lf%lf",&a,&b,&c);
if((a+b)>c &&……
[/Quote]


我知道这样是正确,但是还是看不出为什么我的程序会错误。
logiciel 2010-07-30
  • 打赏
  • 举报
回复
找到一个反例:

14 7 8

计算出min为7,由于b<=min,输出错误的NO.因此用min判断不可行。
logiciel 2010-07-30
  • 打赏
  • 举报
回复
if(a<=min||a>=max||b<=min||b>=max||b<=min||b>=max)
上面有笔误,c没有出现,但b重复出现。

程序中关于min的计算逻辑好像有问题。

以下修改可以AC.

#include<stdio.h>
#include<math.h>
int main()
{
int t;
int flag;
double a,b,c,max,min; //float a,b,c,max,min;
scanf("%d",&t); //while(scanf("%d",&t)!=EOF)
{
while(t--)
{
flag=1;
scanf("%lf%lf%lf",&a,&b,&c); //scanf("%f %f %f",&a,&b,&c);
if(a+b<b+c)
{max=a+b;
if(max>a+c)
{
max=a+c;
}
}
else
{
max=b+c;
if(max>a+c)
{
max=a+c;
}
}
/*
if(fabs(a-b)>fabs(b-c))
{min=fabs(a-b);
if(min<fabs(a-c))
{
min=fabs(a-c);
}
}
else
{
min=fabs(b-c);
if(min<fabs(a-c))
{
min=fabs(a-c);
}
}
*/
/*if(a<=min||a>=max||b<=min||b>=max||b<=min||b>=max)*/
if(a>=max||b>=max||c>=max)
{flag=0;}

if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}
return 0;
}
Paradin 2010-07-29
  • 打赏
  • 举报
回复
#include<stdio.h>
int main()
{
double a,b,c;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%lf%lf%lf",&a,&b,&c);
if((a+b)>c && (a+c)>b && (b+c)>a && a>0 && b>0 && c>0) printf("YES\n");
else printf("NO\n");
}
return 0;
}
yyandlb 2010-07-29
  • 打赏
  • 举报
回复
DEVC++ 和VC++6.0
编译都通过,测试结果也没错,就是提交到OJ的时候是Wrong answer
zhangweiit 2010-07-29
  • 打赏
  • 举报
回复
你用的是哪个IDE,OR 编译器
yyandlb 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhangweiit 的回复:]

因为fabs参数与返回值都是double的
你用float,他会提示类型转换丢失数据的警告
[/Quote]
fabs



原型:extern float fabs(float x);

用法:#include <math.h>

功能:求浮点数x的绝对值

说明:计算|x|, 当x不为负时返回x,否则返回-x

函数说明这里是float的啊

yyandlb 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhangweiit 的回复:]

你把flaot a,b,c,max,min;
改成
double a,b,c,max,min;
[/Quote]
依然是WA~~
zhangweiit 2010-07-29
  • 打赏
  • 举报
回复
因为fabs参数与返回值都是double的
你用float,他会提示类型转换丢失数据的警告
zhangweiit 2010-07-29
  • 打赏
  • 举报
回复
你把flaot a,b,c,max,min;
改成
double a,b,c,max,min;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧