Surround the Trees

此题讨论区里大喊有坑,原谅我没有仔细读题还跳过了坑点。

题意:平面上有n棵树,选一些树用绳子围成一个包围圈,使得所有的树都在这个圈内。

思路:简单凸包入门题,凸包裸模板。在做这个题前建议先去学学:叉积极角排序三角形有向面积

贴上代码以后再复习。

struct node
{
double x,y;
} a[N],p[N];
int n,tot;//总点数和凸包上的点数;
double dis(node a,node b)//两点间距离
{
return hypot(a.x-b.x,a.y-b.y);
}
//向量叉积(x1*y2-x2*y1);为正在直线右边(逆时针排列),为负在直线左边,为0共线;
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()
{
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]);
sort(a+1,a+n,cmp);//极角排序确定点的顺序;
if(n==1)
{
printf("0.00\n");
return ;
}
if(n==2)
{
printf("%.2f\n",dis(a[0],a[1]));
return ;
}
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];
}
double diss=0;
for(int i=0; i<tot; i++) diss+=dis(p[i],p[(i+1)%tot]);
printf("%.2f\n",diss);
}
int main()
{
while(~scanf("%d",&n)&&n)
{
for(int i=0; i<n; i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
Graham();
}
return 0;
} /*****************************************
***************** LYQ ***************
***************** YES ***************
*UserID: secrecy *
*RunOJ: *
*RunID: *
*Submit time: *
*Language: G++ *
*Result: Accepted *
*time: *
*Memory: *
*Length: *
*School: NYIST *
*Blog: http://blog.csdn.net/nyist_tc_lyq *
*QQ: *
*Tel: *
*****************************************/

人生第一个凸包算法,Good job!

最新文章

  1. SQL SELECT INTO使用
  2. mybatis Generator配置文件详解
  3. stc89c52开发板遥控器解码 红外线发射 内置 eeprom 存储 串口显示编码
  4. java多线程解决生产者消费者问题
  5. smarty函数-继承extents
  6. 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片
  7. SonarQube4.4+Jenkins进行代码检查实例之二
  8. xgboost中如何自定义metric(python中)
  9. JAVA常见异常集锦(持续更新)
  10. Just do it!!!
  11. 转:WebDriver(Selenium2) 判断页面是否刷新的方法
  12. 基于webpack2.x的vue2.x的多页面站点
  13. (图文实例)用VB.net操作SQLite数据库
  14. WebApi-路由机制
  15. selenium之 chromedriver与chrome版本映射表(更新至v2.43)
  16. mvc框架模式
  17. python之字符串及其方法---整理集
  18. Python 的名称空间和作用域
  19. pygame 笔记-10 摩擦力与屏幕环绕
  20. C# Winform使用Windows Media Player播放多媒体整理

热门文章

  1. Vue的十个常用指令
  2. iOS组件化开发&#183; 什么是组件化
  3. [转+补]Android打包so后魅族5中安装运行崩溃问题的解决方法
  4. 【MYSQL】mysql-5.6.19-win32免安装版本配置方法
  5. codevs 5462 HYY迎亲I
  6. Educational Codeforces Round 12补题 经典题 再次爆零
  7. python常用模块之json和pickle模块
  8. CSS BEM 命名规范简介
  9. syslog(),closelog()与openlog()--日志操作函数 (2)
  10. 黑苹果10.10.3手动开启SSD的TIRM提高硬盘效率