sdut 2153 Clockwise (2010年山东省第一届ACM大学生程序设计竞赛)
题目大意:
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大学生程序设计竞赛)的更多相关文章
- sdut 2159 Ivan comes again!(2010年山东省第一届ACM大学生程序设计竞赛) 线段树+离散
先看看上一个题: 题目大意是: 矩阵中有N个被标记的元素,然后针对每一个被标记的元素e(x,y),你要在所有被标记的元素中找到一个元素E(X,Y),使得X>x并且Y>y,如果存在多个满足条 ...
- 2010年山东省第一届ACM大学生程序设计竞赛 Balloons (BFS)
题意 : 找联通块的个数,Saya定义两个相连是 |xa-xb| + |ya-yb| ≤ 1 ,但是Kudo定义的相连是 |xa-xb|≤1 并且 |ya-yb|≤1.输出按照两种方式数的联通块的各数 ...
- Hello World! 2010年山东省第一届ACM大学生程序设计竞赛
Hello World! Time Limit: 1000MS Memory limit: 65536K 题目描述 We know that Ivan gives Saya three problem ...
- Phone Number 2010年山东省第一届ACM大学生程序设计竞赛
Phone Number Time Limit: 1000MS Memory limit: 65536K 题目描述 We know that if a phone number A is anothe ...
- [2011山东省第二届ACM大学生程序设计竞赛]——Identifiers
Identifiers Time Limit: 1000MS Memory limit: 65536K 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?act ...
- sdut Mountain Subsequences 2013年山东省第四届ACM大学生程序设计竞赛
Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There ...
- [2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !
n a^o7 ! 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2413 Time Lim ...
- angry_birds_again_and_again(2014年山东省第五届ACM大学生程序设计竞赛A题)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2877 题目描述 The problems ca ...
- [2012山东省第三届ACM大学生程序设计竞赛]——Mine Number
Mine Number 题目:http://acm.sdut.edu.cn/sdutoj/problem.php? action=showproblem&problemid=2410 Time ...
随机推荐
- 如何实现ASP.NET中网站访问量的统计
如何实现ASP.NET中网站访问量的统计 2009-07-30 15:50 佚名 网翼教程网 字号:T | T 本文介绍了如何在asp.net中进行网站访问量的统计. AD:51CTO 网+ 第十二期 ...
- 使用ROS节点(五)
先启动roscore roscore 为了获取节点信息,可以使用rosnode命令 $ rosnode 获取得一个可接受参数清单
- 飞天诚信usb-key登录windows+远程桌面
最近在尝试用智能卡做身份验证,以飞天诚信的ePass3000为例. 1.网络环境搭建: 用3台虚机+1台实体机搭一个单独的测试网段:172.16.188.x,如下: 机器名 IP 操作系统 作用 do ...
- Hibernate中的多对多映射
1.需求 项目与开发员工 一个项目,有多个开发人员 一个开发人员,参与多个项目 [多对多] 2.实体bean设计 Project: public class Project { private int ...
- 介绍几个java把网页报存为图片的框架
java在图像这一块非常弱.用java实现java截图倒不难,原理吗就是把当前屏幕存成一个图,然后获取鼠标拉去的想去位置然后把截取的图保存到panel里边,再生成图片即可:示例代码就不展示了,网上很多 ...
- hadoop源码阅读
1.Hadoop的包的功能分析 2.由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化.Hadoop并没有采用java的序列化,而是引入它自己的系统.org.ap ...
- checkbox的全选、反选(计算价格)
package com.baidu.jisuan; import java.util.ArrayList;import java.util.List; import com.baidu.adapter ...
- java运算符的优先级
Java 编辑 运算符 结合性 [ ] . ( ) (方法调用) 从左向右 ! ~ ++ -- +(一元运算) -(一元运算) 从右向左 * / % 从左向右 + - 从左向右 << & ...
- 大嫂的HTML
<html> <head> <style type="text/css"> *{ margin: 0; padding: 0; ...
- Git的常用命令的使用方法和解释
我们常用的git命令: add Add file contents to the index(将文件添加到暂存区) 用法: 保存某个文件到暂缓区:git add 文件名 保存当前路径的 ...