[Noip模拟赛] Polygon
2015-07-08 08:27
603 查看
POLYGON
源程序名 POLYGON.??? (PAS,C,CPP)
可执行文件名 POLYGON.EXE
输入文件名 POLYGON.IN
输出文件名 POLYGON.OUT
对于一个多边形来说,在该多边形内任取两点,如果这两点连成的线段落在多边形内,则称这样的多边形为凸多边形。
平面上有N个坐标值为自然数的圆点。顶点数最多凸多边形是指由给定的圆点中的一部分组成的凸多边形,它包含最大可能的顶点数。原点,即坐标内中心(0,0)必须是顶点数最多凸多边形的一个顶点。
编写程序求出这样的凸多边形的最大顶点数。注意一个多边形的连续的边不能是平行的。
输入
输入文件的第一行包含一个自然数N,2≤N≤100,表示给定的圆点数。
下面的N行每行包含两个用空格隔开的自然数X和Y,1≤X≤100,1≤Y≤100,表示一个圆点的坐标值。所有的圆点是不相同的。
输出
输出文件的第一行也是唯一的一行应该包含顶点数最多凸多边形的顶点数。注意结果应不小于3。
样例
POLYGON.IN
8
10 8
3 9
2 8
2 3
9 2
9 10
10 3
8 10
POLYGON.OUT
8
【题解】
有点坑。。第一眼看成求凸包顶点数了结果竟然还有50分= =
然后后面想了半天不会做
然后呢想了半天发现设f[i,j]表示最后两个点为i和j的情况下凸多边形最大顶点数
那么枚举k [1...i-1]即可,f[i,j]即可用f[k,i]更新
更新的情况当且仅当是个凸多边形(用向量叉积判断)
View Code
源程序名 POLYGON.??? (PAS,C,CPP)
可执行文件名 POLYGON.EXE
输入文件名 POLYGON.IN
输出文件名 POLYGON.OUT
对于一个多边形来说,在该多边形内任取两点,如果这两点连成的线段落在多边形内,则称这样的多边形为凸多边形。
平面上有N个坐标值为自然数的圆点。顶点数最多凸多边形是指由给定的圆点中的一部分组成的凸多边形,它包含最大可能的顶点数。原点,即坐标内中心(0,0)必须是顶点数最多凸多边形的一个顶点。
编写程序求出这样的凸多边形的最大顶点数。注意一个多边形的连续的边不能是平行的。
输入
输入文件的第一行包含一个自然数N,2≤N≤100,表示给定的圆点数。
下面的N行每行包含两个用空格隔开的自然数X和Y,1≤X≤100,1≤Y≤100,表示一个圆点的坐标值。所有的圆点是不相同的。
输出
输出文件的第一行也是唯一的一行应该包含顶点数最多凸多边形的顶点数。注意结果应不小于3。
样例
POLYGON.IN
8
10 8
3 9
2 8
2 3
9 2
9 10
10 3
8 10
POLYGON.OUT
8
【题解】
有点坑。。第一眼看成求凸包顶点数了结果竟然还有50分= =
然后后面想了半天不会做
然后呢想了半天发现设f[i,j]表示最后两个点为i和j的情况下凸多边形最大顶点数
那么枚举k [1...i-1]即可,f[i,j]即可用f[k,i]更新
更新的情况当且仅当是个凸多边形(用向量叉积判断)
#include <stdio.h> using namespace std; struct P { int x,y; }p[105]; int n; int f[105][105]; // f i,j 表示凸多边形的最后两个顶点为i,j所构成的最多顶点数 inline void IO() { freopen("polygon.in","r",stdin); freopen("polygon.out","w",stdout); } inline int max(int a,int b) {return a<b?b:a;} inline void swap(P &a, P &b) { int _tem; _tem=a.x, a.x=b.x, b.x=_tem; _tem=a.y, a.y=b.y, b.y=_tem; } inline int cj(P a, P b) { return a.x*b.y-b.x*a.y; } inline void RS() { p[0].x=0, p[0].y=0; scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d %d",&p[i].x,&p[i].y); //按照斜率排序 for (int i=1;i<n;++i) for (int j=i+1;j<=n;++j) if (p[i].x*p[j].y < p[j].x*p[i].y) // y1/x1 > y2/x2 swap(p[i],p[j]); for (int i=1;i<=n;++i) f[0][i]=1; for (int i=1;i<=n;++i) for (int j2=i+1;j2<=n+1;++j2) for (int k=0;k<=i-1;++k) { int j; P _x, _y; int _tem; if (j2==n+1) j=0; else j=j2; _x.x=p[i].x-p[k].x, _x.y=p[i].y-p[k].y; _y.x=p[j].x-p[i].x, _y.y=p[j].y-p[i].y; int c = cj(_y,_x); if (c<0) f[i][j]=max(f[i][j],f[k][i]+1); } int ans=0; for (int i=0;i<=n;++i) for (int j2=i+1;j2<=n+1;++j2) { int j; if (j2==n+1) j=0; else j=j2; ans = max(ans,f[i][j]); } printf("%d\n",ans); } int main() { IO(), RS(); return 0; }
View Code
相关文章推荐
- 给category添加基本数据类型属性
- ZXingObjC 64位 集成到自己的项目中(xcode 6.4)
- 【Go语言】【13】 4000 再谈GO语言的结构体
- 【Go语言】【13】再谈GO语言的结构体
- OC中的Category类别
- K-Nearest Neighbors algorithm
- Algorithms—33.Search in Rotated Sorted Array
- 给分类(Category)添加属性
- 聊一聊google的Knowledge Graph
- view设置gone的时候getHeight()的值
- django + uwsgi 配置
- Django DEBUG = False 引起的问题 django - Setting DEBUG = False causes 500 Error
- Algorithms—14.Longest Common Prefix
- golang 文件简单操作
- Django运行方式及处理流程总结
- Algorithms—9.Palindrome Number
- Why we need template on Django ?
- 关于delegate, category和subclass
- 手动更新google服务框架
- 审美、效用与情感——关于icon和Logo设计的一些想法