开始复健。

用了不方便的算面积的方法,讨论了好多,还调了一个多小时- -

发现 double 和 longdouble 的四舍五入是随机的,有时候舍5有时候入5。

《信息学奥赛一本通》题库 1034 计算三角形面积——基础_前端 数值 题解 编程语言《信息学奥赛一本通》题库 1034 计算三角形面积——基础_四舍五入_02
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long double x[3],y[3],x2,y2,tx,ty,dc;
double ans;
int bj=-1;
bool fx;
int main()
{
  for(int i=0;i<3;i++)
    scanf("%Lf%Lf",&x[i],&y[i]);
  for(int i=0;i<3;i++)
    {
      int d=i+1; if(d==3)d=0;
      /*printf("i=%d d=%d (%.1Lf,%.1Lf) (%.1Lf,%.1Lf)\n",
    i,d,x[i],y[i],x[d],y[d]);*/
      x2=x[i]-x[d]; if(x2<0)x2=-x2;
      y2=y[i]-y[d]; if(y2<0)y2=-y2;
      dc+=x2*y2;
      /*printf("  x1=%.1Lf y1=%.1Lf dc=%.1Lf\n",x2,y2,dc);
    printf("  tx=%.1Lf ty=%.1Lf\n",tx,ty);*/
      if(i==0)tx=x2,ty=y2,bj=2,fx=1;
      else
    {
      if(x2>tx&&y2>ty)
        {
          bj=(i+2)%3; fx=1; tx=x2; ty=y2;
        }
      if(x2>tx)tx=x2,fx=0; if(y2>ty)ty=y2,fx=0;
      //printf("i=%d d=%d fx=%d\n",i,d,fx);
    }
    }
  dc/=2;
  //printf("bj=%d fx=%d\n",bj,fx);
  if(bj!=-1&&fx)
    {
      double tmp=0;
      /*for(int i=0;i<3;i++)
    {
      printf("x[%d]=%.2Lf y[%d]=%.2Lf\n",
         i,x[i],i,y[i]);
    }
    printf("bj=%d\n",bj);*/
      if(bj!=1)
    {
      swap(x[bj],x[1]); swap(y[bj],y[1]);
    }
      /*for(int i=0;i<3;i++)
    {
      printf("x[%d]=%.2Lf y[%d]=%.2Lf\n",
         i,x[i],i,y[i]);
         }*/
      if((x[0]-x[2])*(y[0]-y[2])>=0)
    {
      if((y[0]-y[1])/(x[0]-x[1])<(y[0]-y[2])/(x[0]-x[2]))
        tmp=abs((x[1]-x[2])*(y[0]-y[1]));
      else tmp=abs((x[0]-x[1])*(y[1]-y[2]));
    }
      else
    {
      if((y[0]-y[1])/(x[0]-x[1])<(y[0]-y[2])/(x[0]-x[2]))
        tmp=abs((x[0]-x[1])*(y[1]-y[2]));
      else tmp=abs((x[1]-x[2])*(y[0]-y[1]));
    }
      dc+=tmp;
    }
  //printf("tx=%.1Lf ty=%.1Lf\n",tx,ty);
  ans=tx*ty-dc;
  /*for(int i=0;i<3;i++)
    {
      int d=i+1; if(d==3)d=0;
      long double px=x[i]-x[d]; if(px<0)px=-px;
      long double py=y[i]-y[d]; if(py<0)py=-py;
      if(tx<px||ty<py)
    {
      printf("NO\n");
      printf("x1=%Lf y1=%Lf px=%Lf py=%Lf\n",
         x1,y1,px,py);
      return 0;
    }
    }
    printf("YES\n");*/
  int d=floor(ans*1000); d%=10;
  if(d==5)ans+=0.001;
  printf("%.2lf\n",ans);
  return 0;
}
View Code
《信息学奥赛一本通》题库 1034 计算三角形面积——基础_前端 数值 题解 编程语言《信息学奥赛一本通》题库 1034 计算三角形面积——基础_四舍五入_02
#include<cstdio>
#include<ctime>
#include<algorithm>
using namespace std;
int a,b; double c,d;
int main()
{
  srand(time(0));
  for(int i=0;i<3;i++)
    {
      a=rand()%100; b=rand()%100;
      c=(double)a/10; d=(double)b/10;
      printf("%lf %lf",c,d);
      if(i!=2)putchar(' '); else putchar('\n');
    }
  return 0;
}
mk
《信息学奥赛一本通》题库 1034 计算三角形面积——基础_前端 数值 题解 编程语言《信息学奥赛一本通》题库 1034 计算三角形面积——基础_四舍五入_02
#include<cstdio>
#include<algorithm>
using namespace std;
int cnt;
int main()
{
  while(1)
    {
      cnt++; printf("cnt=%d\n",cnt);
      system("./mk > 1.in");
      system("./a < 1.in > zj.out");
      system("./TJ < 1.in > TJ.out");
      if(system("diff zj.out TJ.out"))break;
      if(cnt==1000)break;
    }
  return 0;
}
dp