zoukankan      html  css  js  c++  java
  • [SCOI2007]最大土地面积

    Description

      在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成
    的多边形面积最大。

    Input

      第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标。

    Output

      最大的多边形面积,答案精确到小数点后3位。

    Sample Input

    5
    0 0
    1 0
    1 1
    0 1
    0.5 0.5

    Sample Output

    1.000

    HINT

    数据范围 n<=2000, |x|,|y|<=100000

    首先最大的4个点一定在凸包上

    先把凸包求出来

    然后选定对角线,然后发现另外两个顶点是单调的,用旋转卡壳的思想

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 struct point
     8 {
     9   double x,y;
    10 }p[5001],s[5001];
    11 int n,top;
    12 double ans,eps=1e-5;
    13 int dcmp(double x)
    14 {
    15   if (x<-eps) return -1;
    16   if (x>eps) return 1;
    17   return 0;
    18 }
    19 double operator *(point a,point b)
    20 {
    21   return a.x*b.y-a.y*b.x;
    22 }
    23 point operator -(point a,point b)
    24 {
    25   return (point){a.x-b.x,a.y-b.y};
    26 }
    27 double dist(point a,point b)
    28 {
    29   return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    30 }
    31 bool cmp(point a,point b)
    32 {
    33   return (a.y<b.y)||(a.y==b.y&&a.x<b.x);
    34 }
    35 bool cmp2(point a,point b)
    36 {
    37   int t=dcmp((p[1]-a)*(p[1]-b));
    38   if (t==0) return dist(p[1],a)<dist(p[1],b);
    39   return t>0;
    40 }
    41 void graham()
    42 {int i;
    43   sort(p+1,p+n+1,cmp);
    44   sort(p+2,p+n+1,cmp2);
    45   s[++top]=p[1];s[++top]=p[2];
    46   for (i=3;i<=n;i++)
    47     {
    48       while (top>1&&dcmp((p[i]-s[top-1])*(s[top]-s[top-1]))>=0) top--;
    49       s[++top]=p[i];
    50     }
    51 }
    52 void solve()
    53 {int i,j;
    54   s[top+1]=s[1];
    55   for (i=1;i<=top-2;i++)
    56     {
    57       int a=i%top+1,b=(i+2)%top+1;
    58       for (j=i+2;j<=top;j++)
    59     {
    60       while (a%top+1!=j&&dcmp((s[a+1]-s[i])*(s[j]-s[i])-(s[a]-s[i])*(s[j]-s[i]))>0) a=a%top+1;
    61       while (b%top+1!=i&&dcmp((s[j]-s[i])*(s[b+1]-s[i])-(s[j]-s[i])*(s[b]-s[i]))>0) b=b%top+1;
    62       //cout<<i<<' '<<a<<' '<<j<<' '<<b<<endl;
    63       ans=max(ans,(s[a]-s[i])*(s[j]-s[i])+(s[j]-s[i])*(s[b]-s[i]));
    64     }
    65     }
    66 }
    67 int main()
    68 {int i;
    69   cin>>n;
    70   for (i=1;i<=n;i++)
    71     {
    72       scanf("%lf%lf",&p[i].x,&p[i].y);
    73     }
    74   graham();
    75   solve();
    76   printf("%.3lf
    ",ans/2.0);
    77 }
  • 相关阅读:
    获取系统信息
    Spring下获取项目根路径--good
    Java 获取webapp,Root,classpath,项目等路径工具类
    并发与并行的区别
    享元模式的简单使用
    mysql 分库分表(水平切割和垂直切割)
    sql随机筛选几条记录
    创建表
    sql字段组合唯一
    Jobject 使用
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8273976.html
Copyright © 2011-2022 走看看