• BZOJ1132: [POI2008]Tro


    1132: [POI2008]Tro

    Time Limit: 20 Sec  Memory Limit: 162 MB
    Submit: 815  Solved: 211
    [Submit][Status]

    Description

    平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000

    Input

    第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000]

    Output

    保留一位小数,误差不超过0.1

    Sample Input

    5
    0 0
    1 2
    0 2
    1 0
    1 1

    Sample Output

    7.0

    HINT

    Source

    题解:

    这题我们每次以最左边的点为原点,将其它点按照极角排序(极角我想就是某点与原点连线的斜率),

    然后按标号枚举另一个点,利用叉积求面积,并且用部分和来优化。

    实数果然有精度问题。。记得/的时候要把数据强制转化为你需要的类型,否则做的就是整型除法。

    代码:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<iostream>
     7 #include<vector>
     8 #include<map>
     9 #include<set>
    10 #include<queue>
    11 #include<string>
    12 #define inf 1000000000
    13 #define maxn 3000+500
    14 #define maxm 500+100
    15 #define eps 1e-10
    16 #define ll long long
    17 #define pa pair<int,int>
    18 #define for0(i,n) for(int i=0;i<=(n);i++)
    19 #define for1(i,n) for(int i=1;i<=(n);i++)
    20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
    21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
    22 using namespace std;
    23 inline int read()
    24 {
    25     int x=0,f=1;char ch=getchar();
    26     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    27     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    28     return x*f;
    29 }
    30 int n;
    31 struct rec{ll x,y;double z;}a[maxn];
    32 inline double kk(rec a,rec b)
    33 {
    34     if(b.x==a.x)
    35     {
    36         if(b.y<a.y)return -inf;else return inf;
    37     }
    38     return (double)(b.y-a.y)/(double)(b.x-a.x);
    39 }
    40 inline bool cmp(rec a,rec b)
    41 {
    42     return a.z<b.z;
    43 }
    44 int main()
    45 {
    46     freopen("input.txt","r",stdin);
    47     freopen("output.txt","w",stdout);
    48     n=read();
    49     for1(i,n)a[i].x=read(),a[i].y=read();
    50     ll ans=0;
    51     for1(i,n-2)
    52     {
    53       int k=i;    
    54       for2(j,i+1,n)if(a[j].x<a[k].x)k=j;
    55       swap(a[k],a[i]);
    56       for2(j,i+1,n)a[j].z=kk(a[i],a[j]);
    57       sort(a+i+1,a+n+1,cmp);    
    58       ll xx=0,yy=0;
    59       for2(j,i+1,n)
    60         {
    61           ans+=(a[j].x-a[i].x)*yy-(a[j].y-a[i].y)*xx;
    62           xx+=a[j].x-a[i].x;yy+=a[j].y-a[i].y;
    63               //cout<<ans<<' '<<xx<<' '<<yy<<' '<<a[j].x<<' '<<a[j].y<<' '<<a[j].z<<endl;
    64         }              
    65     }    
    66     printf("%lld",abs(ans)/2);
    67     if(ans&1)puts(".5");else puts(".0");
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    js 能实现监听F5页面刷新子iframe 而父页面不刷新
    Thinkpad X201 Gobi2000 上电信3G网络
    【M30】代理类
    C++数组
    【M27】要求或者禁止对象产生于heap之中
    C++ delete operator做了什么事
    【M33】将非尾端类设计为抽象类
    【M32】在未来时态下发展程序
    【M34】如何在同一个程序中结合C++和C
    【M25】将构造方法和非成员方法虚化
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3968857.html
Copyright © 2020-2023  润新知