Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77187
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 14:00
个人简介

有梦想的人,正在努力

文章分类

全部博文(32)

文章存档

2015年(32)

我的朋友

分类: C/C++

2015-04-29 17:35:35

           这道题的意思就是让你算面积。我们可以用叉积来算,由于算出来的叉积总合可能是负的,所以要取正再取正值。
点积: a·bcosx1*x2 + y1*y2
叉积: a·bsin x1*y2 - x2*y1 (几何意义时两个向量的边构成的平行四边形的面积)
所以算出来的sum要除以2;

如果还是不清楚叉积的话可以找度娘问问。

另外数据比较大,计算总和要用longlong,不能用double,数据量很大除以2会损失精度,我因此WA了几次。
AC代码如下:


  1. #include <stdio.h>
  2. #include <string.h>
  3. #define Abs(x) (x < 0) ? (-x) : (x)
  4. char s[1000005];
  5. int dir_x[10] = {0, -1, 0, 1, -1, 0, 1, -1, 0, 1};
  6. int dir_y[10] = {0, -1, -1, -1, 0, 0, 0, 1, 1, 1};

  7. int main()
  8. {
  9.     int t;
  10.     scanf("%d", &t);
  11.     getchar();
  12.     int x0 = 0, y0 = 0;
  13.     int x1, y1, x2, y2;
  14.     while(t--)
  15.     {
  16.         long long sum = 0;
  17.         scanf("%s", s);
  18.         int l = strlen(s);

  19.         if(1 == l) {printf("0\n"); continue;}

  20.         x2 = dir_x[s[0] - '0']; y2 = dir_y[s[0] - '0'];
  21.         int i;
  22.         for(i = 1; i < l; ++i)
  23.         {
  24.             x1 = x2; y1 = y2;
  25.             x2 += dir_x[s[i] - '0'];
  26.             y2 += dir_y[s[i] - '0'];
  27.             sum += (x1 - x0)*(y2 - y0) - (x2 - x0)*(y1 - y0);
  28.         }
  29.         if(sum % 2 == 0) printf("%lld\n", Abs(sum / 2));
  30.         else printf("%lld.5\n", Abs(sum / 2)); //long long 除以2后会丢失小数部分,可以加一个.5避免
  31.     }
  32.     return 0;
  33. }

另外,对于long long,%lld在Windows上可能不行(编译器可能不支持),可以用%I64d。

阅读(488) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~