zoukankan      html  css  js  c++  java
  • SPOJ UMR 10A 计算几何

    DES:顺时针给出构成凸多边形的点。然后有Q个询问任意给出两个点的编号,询问由这两个点的连线将多边形分成的两部分面积较小的部分面积大小。

    比赛时直接每次连线后求多边形求面积超时了。正确解法是求出利用叉积球三角形面积不断求和求出多边形总面积的同时,保留多边形的前缀和。当任意两点连线时,只要用前缀和想减再减去一个三角形的面积即可。

    然而...我不理解的是关于q的那个循环...for就是超时...while就是AC...坐标明明是interger...int就WA...double就AC...

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    using namespace std;
    
    struct Point
    {
        double x, y;
    } p[50010];
    
    double areaa(Point p0, Point p1, Point p2)  //计算以这三个点为顶点的三角形面积
    {
        double temp = (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
        temp /= 2.0;
        return fabs(temp);
    }
    
    double area[50010];  // 存储多边形的前缀多边形的面积。
    
    int main()
    {
        int n, q;
        int xx, yy;
        while(~scanf("%d%d", &n, &q))
        {
            for (int i=0; i<n; ++i)
            {
                scanf("%lf%lf", &p[i].x, &p[i].y);
            }
            double tot_area = 0;
            area[0] = 0;
            area[1] = 0;
            for (int i=1; i<n-1; ++i)
            {
                tot_area += areaa(p[0], p[i], p[i+1]);
                area[i+1] = tot_area;
            }
            int t1, t2;
            double ans;
            double temp_area;
    
            while(q--)
            {
                scanf("%d%d", &t1, &t2);
                if (t2 > t1) swap(t1, t2);  // 保证t1>t2
                temp_area = area[t1]-area[t2]-areaa(p[0], p[t1], p[t2]);
                if (temp_area < tot_area-temp_area)
                    printf("%.1lf
    ", temp_area);
                else printf("%.1lf
    ", tot_area-temp_area);
            }
        }
        return 0;
    }
    L哦哦K
  • 相关阅读:
    学习笔记10.28
    学习目标
    ajax传值修改数据
    php 4种传值方式
    01-17权限管理
    01-16作业:文件管理
    01-15文件操作
    01-12文件上传
    1-6 号 详情
    ajax登陆提示
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4691447.html
Copyright © 2011-2022 走看看