题目大意:

n个点,第i个点和第i+1个点可以构成向量,问最少删除多少个点可以让构成的向量顺时针旋转或者逆时针旋转。

分析:

dp很好想,dp[j][i]表示以向量ji(第j个点到第i个点构成的向量)为终点的最大顺时针/逆时针向量数。状态转移方程为 dp[j][i] = max{dp[k][j]+1}。

问题个关键是如何判断2个向量是顺时针还是逆时针。

计算几何用的知识是求叉积和点积,叉积的作用是判断两个向量的左右(顺逆),点积的作用是判断两个向量的前后。举个例子,假设有2个向量v1,v2,‘*’暂时代表叉积运算,‘·’暂时代表点积运算。叉积判定:如果v1*v2>0,则v1在v2的顺时针方向;如果v1*v2=0,则v1、v2共线;如果v1*v2<0,则v1在v2的逆时针方向。点积判定:如果v1·v2>0,则v1和v2都指向同一侧面;如果v1·v2=0,则v1和v2垂直;如果v1·v2<0,则v1和v2都指向相反的侧面。

顺时针的旋转范围是(0<=T<180),逆时针的旋转范围是(0<T<=180),也就是说如果两条向量共线的话,顺时针旋转可以同方向(T=0),不能反方向;逆时针旋转可以反方向(T=180),不能同方向。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<set>
#include<queue>
#include<stack>
#define MAXN 310 using namespace std;
int dp[MAXN][MAXN],n;
struct Point
{
int x,y;
Point (int x_=,int y_=):x(x_),y(y_) {}
} p[MAXN];
typedef Point Vector;
Vector operator -(Point a,Point b)
{
return Vector(a.x-b.x,a.y-b.y);
}
int Cross(Vector a,Vector b)//向量叉积
{
return a.x*b.y-a.y*b.x;
}
int Dot(Vector a,Vector b)//向量点乘
{
return a.x*b.x+a.y*b.y;
}
int if_shun(int i,int j,int k)//判断顺时针
{ Vector v1=p[i]-p[j];
Vector v2=p[j]-p[k];
int tem=Cross(v1,v2);
if(tem>)
return ;
else if(tem<)
return ;
if(tem==)
{
int tem1=Dot(v1,v2);
if(tem1<)
return ;
return ;
}
}
int if_ni(int i,int j,int k)//判断逆时针
{ Vector v1=p[i]-p[j];
Vector v2=p[j]-p[k];
int tem=Cross(v1,v2);
if(tem>)
return ;
else if(tem<)
return ;
if(tem==)
{
int tem1=Dot(v1,v2);//向量共线,判断一下方向
if(tem1<)
return ;
return ;
}
}
int puan_shun()
{
int ans=;
//dp[0][1]=1;
for(int i=; i<n; i++)
{
for(int j=; j<i; j++)
{
dp[j][i]=;
for(int k=; k<j; k++)
{
if(if_shun(i,j,k))
dp[j][i]=max(dp[j][i],dp[k][j]+);
}
ans=max(ans,dp[j][i]);
} }
return ans;
}
int puan_ni()
{
int ans=;
//dp[0][1]=1;
for(int i=; i<n; i++)
{
for(int j=; j<i; j++)
{
dp[j][i]=;
for(int k=; k<j; k++)
{
if(if_ni(i,j,k))
dp[j][i]=max(dp[j][i],dp[k][j]+);
}
ans=max(ans,dp[j][i]);
} }
return ans;
} int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=; i<n; i++)
scanf("%d %d",&p[i].x,&p[i].y);
memset(dp,,sizeof(dp));
int ans1=puan_shun();
memset(dp,,sizeof(dp));
int ans2=puan_ni();
//printf("%d %d==\n",ans1,ans2);
if(ans1==n-)
printf("C\n");
else if(ans2==n-)
printf("CC\n");
else if(ans1>=ans2)
printf("Remove %d bead(s), C\n",n-ans1-);
else
printf("Remove %d bead(s), CC\n",n-ans2-);
printf("\n");
}
return ;
}

sdut 2153 Clockwise (2010年山东省第一届ACM大学生程序设计竞赛)的更多相关文章

  1. sdut 2159 Ivan comes again!(2010年山东省第一届ACM大学生程序设计竞赛) 线段树+离散

    先看看上一个题: 题目大意是: 矩阵中有N个被标记的元素,然后针对每一个被标记的元素e(x,y),你要在所有被标记的元素中找到一个元素E(X,Y),使得X>x并且Y>y,如果存在多个满足条 ...

  2. 2010年山东省第一届ACM大学生程序设计竞赛 Balloons (BFS)

    题意 : 找联通块的个数,Saya定义两个相连是 |xa-xb| + |ya-yb| ≤ 1 ,但是Kudo定义的相连是 |xa-xb|≤1 并且 |ya-yb|≤1.输出按照两种方式数的联通块的各数 ...

  3. Hello World! 2010年山东省第一届ACM大学生程序设计竞赛

    Hello World! Time Limit: 1000MS Memory limit: 65536K 题目描述 We know that Ivan gives Saya three problem ...

  4. Phone Number 2010年山东省第一届ACM大学生程序设计竞赛

    Phone Number Time Limit: 1000MS Memory limit: 65536K 题目描述 We know that if a phone number A is anothe ...

  5. [2011山东省第二届ACM大学生程序设计竞赛]——Identifiers

    Identifiers Time Limit: 1000MS Memory limit: 65536K 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?act ...

  6. sdut Mountain Subsequences 2013年山东省第四届ACM大学生程序设计竞赛

    Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There ...

  7. [2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !

    n a^o7 ! 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2413 Time Lim ...

  8. angry_birds_again_and_again(2014年山东省第五届ACM大学生程序设计竞赛A题)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2877 题目描述 The problems ca ...

  9. [2012山东省第三届ACM大学生程序设计竞赛]——Mine Number

    Mine Number 题目:http://acm.sdut.edu.cn/sdutoj/problem.php? action=showproblem&problemid=2410 Time ...

随机推荐

  1. java 面向对象编程-- 第十三章 反射、类加载与垃圾回收

    1.狭义JavaBean规范 Javabean必须包含一个无参数的public构造方法,方便通过反射的方式产生对象. 属性必须都是私有的. Javabean必须包含符合命名规范的get和set方法,以 ...

  2. outlook新邮件到达提醒设置以及outlook最小化到托盘设置

    有些邮件是需要马上处理的,因此希望能在收到邮件之后马上就知道,但是有不希望频繁的去检查有没有.outlook可以帮我们轻松做到新邮件到达提醒. 一 .设置outlook新邮件到达提醒:选项->电 ...

  3. lucas 定理学习

    大致意思就是求组合数C(n , m) % p的值, p为一个偶数 可以将组合数的n 和 m都理解为 p 进制的表示 n  = ak*p^k + a(k-1)*p^(k-1) + ... + a1*p ...

  4. SharePoint加K2,将Portal系统与BPM系统完美整合!

    K2 blackPearl与Microsoft Office SharePoint 一起为解决人员和流程相互合作的解决方案而提供一个强大的平台. K2“blackpearl”根据企业的需求提供了设计, ...

  5. iOS 引导页组件 HcdGuideView

    HcdGuideView HcdGuideView让你为你的app添加一个漂亮的启动页变得简单. 要求 Xcode 6 or higher iOS 7.0 or higher ARC 安装方法 手动安 ...

  6. Centos使用key登录验证

    1. 新建用户lsyw 设置密码 #useradd lsyw #passwd lsyw 2. 测试新建用户可以登录 3. 修改root登录密码为通用root密码,测试用新密码登录是否成功 0!B2pj ...

  7. php 封装分页查询类

    <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 private $lis ...

  8. ios创建bundle的图片资源文件(转)

    在ios开发中为了方便管理资源文件,可以使用bundle的方式来进行管理,比如kkgridview里就是把所需的图片文件全部放在一个bundle来管理的 . 切记目前iOS中只允许使用bundle管理 ...

  9. vega prime 1.2 (视景仿真)

    Vega Prime 1.2 (视景仿真) MPI的视景仿真渲染工具Vega是世界上领先的应用于实时视景仿真.声音仿真和虚拟现实等领域的软件环境,它用来渲染战场仿真.娱乐.城市仿真.训练模拟器和计算可 ...

  10. SDIO接口

    SDIO卡是在SD内存卡接口的基础上发展起来的接口,SDIO接口兼容以前的SD内存卡,并且可以连接SDIO接口的设备,目前根据SDIO协议的SPEC,SDIO接口支持的设备总类有蓝牙,网卡,电视卡等. ...