POJ1228:Grandpa's Estate——题解

http://poj.org/problem?id=1228

题目大意:给一个凸包,问是否为稳定凸包。

————————————————————————

稳定凸包的概念为:我任意添加一个点都不能使这个凸包得到扩充,这样的凸包为稳定凸包。

我们求完凸包后枚举边然后枚举有多少点在上面即可。

(网上的程序真的大部分是错的……)

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1001;
struct point{
    int x;
    int y;
}p[N],q[N];
int n,per[N],l;
inline point getmag(point a,point b){
    point s;
    s.x=b.x-a.x;s.y=b.y-a.y;
    return s;
}
inline int multiX(point a,point b){
    return a.x*b.y-b.x*a.y;
}
inline int dis(point a,point b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
inline bool cmp(int u,int v){
    int det=multiX(getmag(p[1],p[u]),getmag(p[1],p[v]));
    if(det!=0)return det>0;
    return dis(p[1],p[u])<dis(p[1],p[v]);
}
void graham(){
    int id=1;
    for(int i=2;i<=n;i++){
    if(p[i].x<p[id].x||(p[i].x==p[id].x&&p[i].y<p[id].y))id=i;
    }
    if(id!=1)swap(p[1],p[id]);
    for(int i=1;i<=n;i++)per[i]=i;
    sort(per+2,per+n+1,cmp);
    l=0;
    q[++l]=p[1];
    for(int i=2;i<=n;i++){
    int j=per[i];
    while(l>=2&&multiX(getmag(q[l-1],p[j]),getmag(q[l-1],q[l]))>=0){
        l--;
    }
    q[++l]=p[j];
    }
    return;
}
bool judge(){
    for(int i=1;i<=l;i++){
    int sum=0;
    for(int j=1;j<=n;j++){
        if(multiX(getmag(q[i],p[j]),getmag(p[j],q[i%l+1]))==0)sum++;
    }
    if(sum<3)return 0;
    }
    bool flag=0;
    for(int i=2;i<=l&&!flag;i++){
    if(multiX(getmag(q[i-1],q[i]),getmag(q[i],q[i%l+1]))!=0)flag=1;
    }
    return flag;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);
    graham();
    if(judge())puts("YES");
    else puts("NO");
    }
    return 0;
}

POJ1228:Grandpa's Estate——题解

时间: 2024-09-30 02:00:17

POJ1228:Grandpa's Estate——题解的相关文章

poj1228 Grandpa&#39;s Estate 凸包

Description Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandpa's belongings. The most valuable one was a piece of convex polygon shaped farm in the grandpa's birth village. The farm was originally se

POJ1228 Grandpa&#39;s Estate 稳定凸包

POJ1228 转自http://www.cnblogs.com/xdruid/archive/2012/06/20/2555536.html   这道题算是很好的一道凸包的题吧,做完后会加深对凸包的理解.    题意很关键...这英语看了好几遍才差不多看明白了.意思就是给你一堆点,这堆点本来就是某个凸包上的部分点,问你这堆点是否能确定唯一的凸包(大概这意思吧...).后来搜了一下,发现这种凸包叫做稳定凸包. 首先来了解什么是稳定的凸包.比如有4个点: 这四个点是某个凸包上的部分点,他们连起来后

poj 1228 Grandpa&#39;s Estate(凸包)

Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11508   Accepted: 3188 Description Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandpa's belongings. The most valuable one

Grandpa&#39;s Estate - POJ 1228(稳定凸包)

刚开始看这个题目不知道是什么东东,后面看了大神的题解才知道是稳定凸包问题,什么是稳定凸包呢?所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点.知道了这个东西就简单了,直接求出来凸包后,然后判断每条边上的点是否超过三点就行了. 代码如下: ============================================================================================================

POJ 1228 Grandpa&#39;s Estate [稳定凸包]

Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13112   Accepted: 3697 Description Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandpa's belongings. The most valuable one

【POJ 1228】Grandpa&#39;s Estate 凸包

找到凸包后暴力枚举边进行$check$,注意凸包是一条线(或者说两条线)的情况要输出$NO$ #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define N 1003 #define read(x) x = getint() using namespace std; inline int getint() { int k = 0, fh = 1; char c

Grandpa&#39;s Estate POJ - 1228

Grandpa's Estate POJ - 1228 题意:给一些点,问能否唯一确定一个凸包. 先求凸包,当且仅当每条边都至少三个点时可唯一确定一个凸包. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int maxn=1010; 7 8 struct Node{ 9 i

poj 1228 Grandpa&#39;s Estate (稳定凸包问题)

---恢复内容开始--- 题意:你的长辈给你留了块土地,然而这块土地是以一些钉子来界定的,题目要做的就是给你一堆钉子的坐标(也就是凸包上部分的点),然后问你能不能唯一确定这块土地 //不得不说知道题意后一脸懵逼.. 知识:稳定凸包 所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点. 举一个不稳定的例子 为什么说它不稳定呢?因为他可以加点来得到更大的凸包 那什么样子是稳定的呢? 因此我们可以知道当一个凸包稳定时,凸包的每条边上都要有至少三个点,若只有两

POJ 1228 Grandpa&#39;s Estate --深入理解凸包

题意: 判断凸包是否稳定. 解法: 稳定凸包每条边上至少有三个点. 这题就在于求凸包的细节了,求凸包有两种算法: 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类似下面的语句: for(int i=0;i<n;i++) { while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--; ch[m++] = p[i]; } 这样的话,求出来就是最简凸包,即点数尽量少的凸包,因