Space Ant

明天早上最后一科毛概了,竟然毫无复习之意,沉迷刷题无法自拔~~

题意:说实话没有仔细看,大概是一只右眼失明(只能左转)的蚂蚁每天要吃掉一个点的食物才能活下去,现在给出n个点的坐标,求蚂蚁最多能活多少天?

一看就是循环求凸包一直往里循环,数据只有50,这让我有勇气尝试一发。样例水过了却WA了三发。讨论区说的是用点积或者叉积,但我觉得循环凸包思路也行啊。吃饭的时候突然意识到我每次都是用未访问过的点找最坐下端的点排序,却疏漏了如果求最外层的凸包当然可以这样,但此题要循环求内层的凸包,所以外层用完标记然后把最后一个点作为起始点参考排序,回来改改A了。当然我知道是后台较水。。

struct node
{
int x,y,i;
} a[N],p[N];
int n,tot,len,ans[60],v[60];
double dis(node a,node b)
{
return hypot(a.x-b.x,a.y-b.y);
}
int multi(node p0,node p1,node p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int cmp(node p1,node p2)
{
int x=multi(p1,p2,a[0]);
if(x>0||(x==0&&dis(p1,a[0])<dis(p2,a[0]))) return 1;
return 0;
}
void Graham()
{
sort(a+1,a+n,cmp);//a[0]是上一轮最后一个点即本轮的出发点,以其作为参考来极角排序
tot=2,p[0]=a[0],p[1]=a[1];
for(int i=2; i<n; i++)
{
while(tot>1&&multi(a[i],p[tot-1],p[tot-2])>=0) tot--;
p[tot++]=a[i];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(v,0,sizeof(v));
scanf("%d",&n);
for(int i=0; i<n; i++) scanf("%d%d%d",&a[i].i,&a[i].x,&a[i].y);
len=0;
int k=0;
for(int i=1; i<n; i++)
if((a[i].y<a[k].y||(a[i].y==a[k].y&&a[i].x<a[k].x))) k=i;//找到最左下角的;
swap(a[0],a[k]);
ans[len++]=a[0].i;
v[a[0].i]=1;
while(n>1)
{
Graham();//获取凸包上的点;
for(int i=1; i<tot; i++)//a[0]每次
{
ans[len++]=p[i].i;
v[p[i].i]=1;//已访问过
}
a[0]=p[tot-1];
int nn=0;
for(int i=0; i<n; i++) if(!v[a[i].i]) p[nn++]=a[i];//凸包内的点;
for(int i=0; i<nn; i++) a[i+1]=p[i];
n=nn+1;//加上a[0]共nn+1个点;
}
printf("%d",len);
for(int i=0; i<len; i++)
printf(" %d",ans[i]);
printf("\n");
}
return 0;
}

POJ-1696 Space Ant 凸包版花式水过!的更多相关文章

  1. POJ 1696 - Space Ant 凸包的变形

    Technorati Tags: POJ,计算几何,凸包 初学计算几何,引入polygon后的第一个挑战--凸包 此题可用凸包算法做,只要把压入凸包的点从原集合中排除即可,最终形成图形为螺旋线. 关于 ...

  2. poj 1696 Space Ant (极角排序)

    链接:http://poj.org/problem?id=1696 Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

  3. 2018.07.04 POJ 1696 Space Ant(凸包卷包裹)

    Space Ant Time Limit: 1000MS Memory Limit: 10000K Description The most exciting space discovery occu ...

  4. poj 1696:Space Ant(计算几何,凸包变种,极角排序)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2876   Accepted: 1839 Descrip ...

  5. POJ 1696 Space Ant 卷包裹法

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3316   Accepted: 2118 Descrip ...

  6. POJ 1696 Space Ant(极角排序)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2489   Accepted: 1567 Descrip ...

  7. poj 1696 Space Ant(模拟+叉积)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3840   Accepted: 2397 Descrip ...

  8. POJ 1696 Space Ant(点积的应用)

    Space Ant 大意:有一仅仅蚂蚁,每次都仅仅向当前方向的左边走,问蚂蚁走遍全部的点的顺序输出.開始的点是纵坐标最小的那个点,開始的方向是開始点的x轴正方向. 思路:从開始点開始,每次找剩下的点中 ...

  9. POJ 1696 Space Ant(凸包变形)

    Description The most exciting space discovery occurred at the end of the 20th century. In 1999, scie ...

随机推荐

  1. 一文带你读懂 Mysql 和 InnoDB存储引擎

    作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...

  2. IBatis.net特性展示代码

    最近公司计划设计新业务平台架构.数据访问层框架要使用ibatis.net.头让我做些例子给其他同事演示下 ibatis的基本特性.然后评估下看是否使用.本来以后上官方下载NPetshop演示下就行了那 ...

  3. MySql中查询语句实现分页功能

    import java.util.*;import java.sql.*; public class FruitDao {    private Connection conn;    private ...

  4. Nginx常用命令介绍

    #安装nginx准备工作yum install gcyum -y install pcre-develyum install -y zlib-devel #编译安装./configuremake &a ...

  5. 学习python报错处理

    1.如图所示 原因是因为没有安装火狐浏览器驱动. 解决办法:1.下载火狐浏览器驱动https://github.com/mozilla/geckodriver/releases 2.安装包解压后安装在 ...

  6. 如何通过Xcode 5中集成的XCTest框架进行简单的单元测试

    XCTest 1.第一个单元测试 XCTest是Xcode 5中自带的测试框架 下面从一个Demo开始.首先用Xcode新建一个工程UnitTestDemo,工程目录结构如下: 可以看到工程下面多了一 ...

  7. 获取CPU相关信息

    实现效果: 知识运用:  WMI管理类中的ManagementObjectCollection类    ManagementObjectSearcher类的Get方法  和ManagementObje ...

  8. VS打包软件部署------ClickOnce应用安装 (各版本.net引导文件安装,再发布文档离线安装下载地址)

    一.1.其他引导程序包:地址  https://msdn.microsoft.com/zh-cn/vstudio/bb898654.aspx 2.离线安装各版本.net下载版(各种语言):https: ...

  9. Sniper OJ部分writeup

    0x00 shellcode pwn 因为题目直接有源码,我就不拖进IDA了,直接看代码 这是一个典型的栈溢出,我们只需要构造shellcode获得/bin/sh权限就可以得到flag.下面是所用脚本 ...

  10. c语言产生随机数的方法

    在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公 ...