zoukankan      html  css  js  c++  java
  • poj 1228

    就是给你一堆点,看这些点能否构成一个 稳定的凸包。

    凸包每条边上有3个及以上的点就可以了。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 #include <iostream>
     5 #include <iomanip>
     6 #include <algorithm>
     7 #include <vector>
     8 typedef double db;
     9 const db eps = 1e-6;
    10 const db pi = acos(-1);
    11 using namespace std;
    12 int sign(db k){
    13     if (k>eps) return 1; else if (k<-eps) return -1; return 0;
    14 }
    15 int cmp(db k1,db k2){return sign(k1-k2);}
    16 int inmid(db k1,db k2,db k3){return sign(k1-k3)*sign(k2-k3)<=0;}// k3 在 [k1,k2] 内
    17 struct point{
    18     db x,y;
    19     point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
    20     point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
    21     point operator * (db k1) const{return (point){x*k1,y*k1};}
    22     point operator / (db k1) const{return (point){x/k1,y/k1};}
    23     bool operator <(const point &k1)const {
    24         int c=cmp(x,k1.x);
    25         if(c)return c==-1;
    26         return cmp(y,k1.y)==-1;
    27     }
    28 };
    29 int inmid(point k1,point k2,point k3){return inmid(k1.x,k2.x,k3.x)&&inmid(k1.y,k2.y,k3.y);}
    30 db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
    31 db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
    32 vector<point> convexHull(vector<point>ps){
    33     int n = ps.size();if(n<=1)return ps;
    34     sort(ps.begin(),ps.end());
    35     vector<point> qs(n*2);int k=0;
    36     for(int i=0;i<n;qs[k++]=ps[i++])
    37         while (k>1&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k;
    38     for(int i=n-2,t=k;i>=0;qs[k++]=ps[i--])
    39         while (k>t&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k;
    40     qs.resize(k-1);
    41     return qs;
    42 }
    43 vector<point> v;
    44 int t,n;
    45 point p[1005];
    46 point tmp;
    47 int main(){
    48     scanf("%d",&t);
    49     while (t--){
    50         scanf("%d",&n);
    51         for(int i=1;i<=n;i++){
    52             scanf("%lf%lf",&tmp.x,&tmp.y);
    53             v.push_back(tmp);
    54             p[i]=tmp;
    55         }
    56         v=convexHull(v);
    57         int m = v.size();
    58         bool f=1;
    59         for(int i=0;i<m;i++){
    60             int cnt=0;
    61             for(int j=1;j<=n;j++){
    62                 if(inmid(v[i],v[(i+1)%m],p[j])){
    63                     cnt++;
    64                 }
    65             }
    66             if(cnt<3){
    67                 f=0;
    68                 break;
    69             }
    70         }
    71         if(v.size()<=2)f=0;
    72         if(f)printf("YES
    ");
    73         else printf("NO
    ");
    74         v.clear();
    75     }
    76 }
    View Code
  • 相关阅读:
    Flutter 开发环境搭建
    swift 如何控制view的显示与隐藏
    TextView textSize 文字大小
    Android项目增加混淆
    Android EditText 无法换行
    Android 6.0 新特性 整理 资料来自网络
    java线程中的sleep/wait/notify/yield/interrupt方法 整理
    java 抽象类与接口的区别 整理
    android 系统架构
    android handler工作原理
  • 原文地址:https://www.cnblogs.com/MXang/p/10447576.html
Copyright © 2011-2022 走看看