Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 17464 | Accepted: 4850 |
Description
Input
Output
Sample Input
4 5 825 6725 6244865
Sample Output
0 0 0.5 2
首先,这题内存限制要注意,不能开太大的数组,其次不能用double来存坐标,因为会出现精度问题,要用long long ,看了DISCUSS才知道的。。。。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <stack> #include <cstring> #define eps 1e-8 using namespace std; struct Point { long long x, y; Point(long long x=0, long long y=0):x(x),y(y) {} }; typedef Point Vector; double Cross(Vector p1, Vector p2) { return p1.x * p2.y - p2.x * p1.y; } Vector operator - (Vector a, Vector b) { return Vector(a.x - b.x, a.y - b.y); } int main() { int t; scanf("%d", &t); getchar(); char ch; while(t--) { Point o, p, tp; o.x = 0; o.y = 0; tp = p = o; long long area = 0; int i = 0; while((ch = getchar()) != '5') { i++; if(ch == '8') p.y += 1; else if(ch == '2') p.y -= 1; else if(ch == '6') p.x += 1; else if(ch == '4') p.x -= 1; else if(ch == '9') { p.x += 1; p.y += 1; } else if(ch == '7') { p.x -= 1; p.y += 1; } else if(ch == '3') { p.x += 1; p.y -= 1; } else if(ch == '1'){ p.x -= 1; p.y -= 1; } if(i != 1) area += Cross(tp, p); tp = p; } if(area < 0) area = - area; if(area % 2 == 0) printf("%lld\n", area / 2); else printf("%lld.5\n", area / 2); getchar(); } return 0; }