POJ 1696 Space Ant 点积计算夹角
题意:
一只特别的蚂蚁,只能直走或者左转。在一个平面上,有很多株植物,这只蚂蚁每天需要进食一株,这只蚂蚁从起点为(0,miny)的点开始出发。求最多能活多少天
分析:
肯定是可以吃到所有植物的,以当前方向无限延长成直线,可以剩余的植物都在直线的左边。所以就是求上一个位置到当前位置与下一个位置与当前位置的夹角,并且使夹角最大。
cos(0~pi)是单调递减的,夹角越大,cos值越小。所以我用点积来计算。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define eps 1e-8
#define INF 1e9
using namespace std; const int maxn=100; typedef struct Point
{
double x,y;
Point() {};
Point(double xx,double yy)
{
x=xx;
y=yy;
}
} Vector; double crs_prdct(Vector a,Vector b)
{
return a.x*b.y-b.x*a.y;
} double dot_prdct(Vector a,Vector b)
{
return a.x*b.x+a.y*b.y;
} Vector operator - (Point a,Point b)
{
return Vector(a.x-b.x,a.y-b.y);
} double dist(Vector v)
{
return sqrt(v.x*v.x+v.y*v.y);
} double dist(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} Point pot[maxn];
bool vis[maxn]; int main()
{
// freopen("in.txt","r",stdin);
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int idx;
double x,y;
int minp=1;
for(int i=1; i<=n; i++)
{
scanf("%d%lf%lf",&idx,&x,&y);
pot[i]=Point(x,y);
if(y==pot[minp].y) minp=x<pot[minp].x? i:minp;
if(y<pot[minp].y) minp=i;
}
pot[0]=Point(0,pot[minp].y);
memset(vis,0,sizeof(vis));
int last=0,now=minp;
printf("%d %d",n,now);
vis[now]=1;
for(int i=2; i<=n; i++)
{
int next;
Vector now_v=Vector(pot[last]-pot[now]);
double cosA=INF;
for(int j=1; j<=n; j++)
{
if(vis[j]) continue;
Vector next_v=Vector(pot[j]-pot[now]);
double cosB=dot_prdct(now_v,next_v)/dist(now_v)/dist(next_v);
if(cosB<cosA)
{
cosA=cosB;
next=j;
}
}
printf(" %d",next);
vis[next]=1;
last=now;
now=next;
}
puts("");
}
return 0;
}
POJ 1696 Space Ant 点积计算夹角的更多相关文章
- poj 1696 Space Ant (极角排序)
链接:http://poj.org/problem?id=1696 Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
- POJ 1696 Space Ant(点积的应用)
Space Ant 大意:有一仅仅蚂蚁,每次都仅仅向当前方向的左边走,问蚂蚁走遍全部的点的顺序输出.開始的点是纵坐标最小的那个点,開始的方向是開始点的x轴正方向. 思路:从開始点開始,每次找剩下的点中 ...
- POJ 1696 Space Ant(极角排序)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2489 Accepted: 1567 Descrip ...
- poj 1696 Space Ant(模拟+叉积)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3840 Accepted: 2397 Descrip ...
- POJ 1696 Space Ant 卷包裹法
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3316 Accepted: 2118 Descrip ...
- 2018.07.04 POJ 1696 Space Ant(凸包卷包裹)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Description The most exciting space discovery occu ...
- poj 1696:Space Ant(计算几何,凸包变种,极角排序)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2876 Accepted: 1839 Descrip ...
- POJ 1696 Space Ant --枚举,模拟,贪心,几何
题意: 有很多点,从最右下角的点开始走起,初始方向水平向右,然后以后每步只能向左边走,问最多能走多少个点. 解法: 贪心的搞的话,肯定每次选左边的与它夹角最小的点,然后走过去. 然后就是相当于模拟地去 ...
- POJ 1696 - Space Ant 凸包的变形
Technorati Tags: POJ,计算几何,凸包 初学计算几何,引入polygon后的第一个挑战--凸包 此题可用凸包算法做,只要把压入凸包的点从原集合中排除即可,最终形成图形为螺旋线. 关于 ...
随机推荐
- 使用UltraISO制作ubuntu安装u盘启动盘图文教程
使用UltraISO制作ubuntu安装u盘启动盘图文教程 胖先森关注 0.9572017.09.07 11:06:15字数 770阅读 27,901 制作U盘启动1.gif 1.首先打开Ultr ...
- 030. Python装饰器
一 装饰器 1.1 装饰器介绍 扩展函数新功能的@定义:替换旧函数,返回新函数,在不改变原有代码的前提下,为该函数扩展新功能;语法:@ (语法糖) 1.2 装饰器的原型 def show(func) ...
- shell基础之if语句
Shell流程控制 流程控制是改变程序运行顺序的指令.linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介 ...
- pyqt安装
一.安装PyQt5 pip install PyQt5 二.安装PyQt-tools pip install PyQt-tools *注:mac不需要安装PyQt-tools,能够正常使用,只支持Wi ...
- 【Python】神器:Streamlit,仅使用Python开发一个运维管理后台(不需要编写html,js,css)
背景 作为SRE,我们有很多很多自动化的工具,大部分都是自动运行的,还有一部分是CLI,我们一直苦于没有一个自己的管理后台网站,受限于前端能力薄弱,开发出来的网页只能说凑活能用,但是不好用. 现在我们 ...
- Go语言流程控制01--选择结构之if
package main import "fmt" /* 字符串比大小 比首字符在字符集中出现的序号,首字符相同则比较第二个字符,以此类推 go的编译器默认使用UTF8字符集 在U ...
- mybatis的多参数传递,使用
1.mybatis的多参数使用 mapper 使用 通过@param注解,传递到xml中的参数名称指定 public interface RedisInstanceTypesMapper extend ...
- Django(50)drf异常模块源码分析
异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_exception(exc) 源码分析 我们点击handle_exception跳转,查看该 ...
- SOC,System on-a-Chip技术初步
SOC,System on-a-Chip技术初步 S O C(拼作S-O-C)是一种集成电路,它包含了电子系统在单个芯片上所需的所有电路和组件.它可以与传统的计算机系统形成对比,后者由许多不同的组件组 ...
- matrix_multiply代码解析
matrix_multiply代码解析 关于matrix_multiply 程序执行代码里两个矩阵的乘法,并将相乘结果打印在屏幕上. 示例的主要目的是展现怎么实现一个自定义CPU计算任务. 参考:ht ...