sdut 2153 Clockwise
来源:互联网 发布:la域名在里注册便宜 编辑:程序博客网 时间:2024/06/07 01:48
链接:
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2153.html
题意:
二维平面内给你n个点,构成n-1个向量(第i和第i+1个点构成第i个向量)
问删除最少的点,使得剩下的点构成的向量按顺序呈顺时针或逆时针。
顺时针:第i个向量顺时针转【0,180)与i+1个向量重合
逆时针:第i个向量逆时针转(0,180】与i+1个向量重合
分析:
把每个向量看作点那么我们就可以把问题转换为lis问题
我们枚举终点来求得答案
记dp【i】【j】为以向量(i,j)为最后一个向量情况下边的最大个数
那么dp【i】【j】=max(dp【i】【j】,dp【k】【i】+1)
其中1<k<j且向量(i,k)顺时针转【0,180)(逆时针转(0,180】) 与向量(i,j)重合
判断向量关系就用叉积和点积
ACcode:
#include <bits/stdc++.h>#define maxn 1005#define eps 1e-8using namespace std;int sgn(double x){ if(fabs(x)<eps)return 0; if(x<0)return -1; return 1;}struct Point{ double x,y; Point(){} Point(double _x,double _y):x(_x),y(_y){} Point operator-(const Point &b)const{ return Point(x-b.x,y-b.y); } double operator^(const Point &b)const{ return x*b.y-y*b.x; } double operator*(const Point &b)const{ return x*b.x+y*b.y; }}my[maxn];int n,ans1,ans2;int dp1[maxn][maxn];int dp2[maxn][maxn];int fun(int i,int j,int k){ Point v1,v2; v1=my[j]-my[i]; v2=my[i]-my[k]; double x=v1^v2; int tmp=sgn(x); if(tmp>0)return 1; if(tmp<0)return 2; x=v1*v2; if(x>eps)return 1; if(x<eps)return 2;}int main(){ while(scanf("%d",&n)&&n){ ans1=ans2=0; memset(dp1,0,sizeof(dp1)); memset(dp2,0,sizeof(dp2)); for(int i=1;i<=n;++i){ int x,y; scanf("%d%d",&x,&y); my[i]=Point(x,y); if(i<n)dp1[i][i+1]=dp2[i][i+1]=1; } for(int j=2;j<=n;++j) for(int i=1;i<j;++i) for(int k=1;k<j;++k) if(fun(i,j,k)==1) ans1=dp1[i][j]=max(dp1[i][j],dp1[k][i]+1); else if(fun(i,j,k==2)) ans2=dp2[i][j]=max(dp2[i][j],dp2[k][i]+1); if(ans1==n-1)puts("C"); else if(ans2==n-1)puts("CC"); else if(ans1>=ans2)printf("Remove %d bead(s), C\n",n-ans1-1); else printf("Remove %d bead(s), CC\n",n-ans2-1); printf("\12"); } return 0;}
0 0
- sdut 2153 Clockwise
- 山东省第一届ACM省赛 C SDUT 2153 Clockwise
- 山东省第一届ACM省赛 C SDUT 2153 Clockwise(dp+计算几何)
- Clockwise/Anti-clockwise
- The ``Clockwise/Spiral Rule''
- The Clockwise/Spiral Rule
- clockwise print binary search tree
- nefu 661 Clockwise 水DP+略几何
- 001-algorithm-print matrix on the clockwise
- hznu 1437: Clockwise(隐藏的暴力水题,数学)
- SDUT-2109&&SDUT-3398
- sdut 1248
- sdut 1468
- sdut 2039
- sdut 2123
- sdut Emergency
- sdut 2151
- sdut 2169
- bugzilla
- 虫食算
- Oracle 中循环遍历某张表,并对符合条件的进行Update操作
- Oracle入门____创建表空间,创建用户,赋权
- vagrant box 相关调查记录
- sdut 2153 Clockwise
- ORACLE中SID和SERVICE_NAME的区别
- 《APUE》读书笔记-第十五章进程间通信
- Nagle Algorithm
- Android主流网络请求开源库的对比(Android-Async-Http、Volley、OkHttp、Retrofit)
- 欢迎使用CSDN-markdown编辑器
- 最大流最小割定理证明
- mongodb监控工具mongostat
- st算法模板(区间最值)