http://acm.nyist.net/JudgeOnline/problem.php?pid=78

圈水池

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
 
描述
有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水,各个水池都标有各自的坐标,现在要你写一个程序利用最短的篱笆将这些供水装置圈起来!(篱笆足够多,并且长度可变)
 
输入
第一行输入的是N,代表用N组测试数据(1<=N<=10)
第二行输入的是m,代表本组测试数据共有m个供水装置(3<=m<=100)
接下来m行代表的是各个供水装置的横纵坐标
输出
输出各个篱笆经过各个供水装置的坐标点,并且按照x轴坐标值从小到大输出,如果x轴坐标值相同,再安照y轴坐标值从小到大输出
样例输入
1
4
0 0
1 1
2 3
3 0
样例输出
0 0
2 3
3 0

分析:

凸包。

AC代码:

 // NYOJ 78 -- 圈水池 Andrew 凸包算法 O(nlogn)
// 将凸包的顶点按 从小到大 先x后y的 顺序输出
//
/*test data
9 100
200 400
300 400
300 300
400 300
400 400
500 400
500 200
350 200
200 200
== 1628 */ #include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; const int MAXP = ;
const double Pzero = 0.00001; struct POINT{
int x,y;
}p[MAXP],CHp[MAXP*]; double XJ(POINT a, POINT b, POINT c){
// vector a->b (b.x-a.x, b.y-a.y)
// vector a->c (c.x-a.x, c.y-a.y)
return (b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y);
} bool comp(POINT a,POINT b){
return (a.x < b.x) || ((a.x==b.x) && (a.y<b.y));
} int AndrewConvexHull(POINT *CHp, int n){
// 计算凸包 CHp[] 逆时针存点
sort(p, p + n, comp);
int nCHp = ;
for (int i = ; i < n ; CHp[nCHp++] = p[i++])
while(nCHp >= && XJ(CHp[nCHp-], CHp[nCHp-], p[i]) <= )
nCHp--;
for (int i = n - ,m = nCHp + ; i >= ; CHp[nCHp++] = p[i--])
while(nCHp >= m && XJ(CHp[nCHp-], CHp[nCHp-], p[i]) <= )
nCHp--;
return --nCHp;
} void init(int n){
// 输入
for (int i = ; i < n; i++)
scanf("%d%d", &p[i].x, &p[i].y);
} void Output(int nCHp){
sort(CHp, CHp + nCHp, comp);
for (int i = ; i < nCHp ; i++){
printf("%d %d\n", CHp[i].x, CHp[i].y);
}
} int main()
{
// freopen("in.txt","r",stdin);
int n;scanf("%d",&n);
while(~scanf("%d",&n) ){ init(n);
int nCHp = AndrewConvexHull(CHp, n);
Output(nCHp);
}
return ;
}

nyist 78 圈水池的更多相关文章

  1. 题解报告:NYOJ #78 圈水池(打印凸包顶点)

    描述: 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水,各个水池都标有各自的坐标,现在要你写一个程序利用最短的篱笆将这些供水装置圈起来!( ...

  2. NYOJ 78 圈水池 (入门级凸包)

    题目链接:nyoj 78  单调链凸包小结 题目讲解:本题考查的主要是凸包的用法,算是入门级的吧,当然前提是你接触过,平面几何: AC代码: #include<iostream> #inc ...

  3. nyoj 78:圈水池 【凸包入门】

    题目链接 将所有点按从左至右顺序排序,然后将所有点先从左到右扫描再从右到左扫描,逐渐将凸包轮廓“勾勒”出来 (凸包轮廓满足,轮廓上连续的三个点按先后顺序给出的话呈逆时针方向) 最后删去一个重复的起(终 ...

  4. 圈水池 nyoj 78 凸包算法

    圈水池 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水, ...

  5. NYOJ-78 圈水池,凸包裸模板!

    圈水池 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 刚做完HDU1392,就看到这个题,嗯,原代码改改就过了. 题意不多说了,会凸包的话很简单,不会也不难,这道题时限是4s ...

  6. nyoj_78:圈水池(凸包入门)

    题目链接 将所有点按从左至右顺序排序,然后将所有点先从左到右扫描再从右到左扫描,逐渐将凸包轮廓"勾勒"出来 (凸包轮廓满足,轮廓上连续的三个点按先后顺序给出的话呈逆时针方向) 最后 ...

  7. NYOJ 圈水池

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...

  8. Monotone Chain Convex Hull(单调链凸包)

    Monotone Chain Convex Hull(单调链凸包)算法伪代码: //输入:一个在平面上的点集P //点集 P 按 先x后y 的递增排序 //m 表示共a[i=0...m]个点,ans为 ...

  9. sdutoj 2152 Balloons

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2152 Balloons Time Limit: ...

随机推荐

  1. WPF 点击Calendar后,需要点击两次按钮

    主面板上有一个Calendar控件,点击选择了日期后,如果点击确认按钮,需要点击两次.这个问题的解决方法如下:     private void calendar1_PreviewMouseUp(ob ...

  2. PHP+Mysql+easyui点击左侧tree菜单对应表名右侧动态生成datagrid加载表单数据(二)

    关于tree菜单生成,参考我的另一篇博文地址tree 菜单 实现功能:点击左侧tree菜单中的table,右侧通过datagrid加载出该表对用的所有数据 难点:获取该表的所有列名,动态生成datag ...

  3. 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP

    经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...

  4. 转: BAT等研发团队的技术博客

    BAT 技术团队博客   1. 美团技术团队博客:  地址: http://tech.meituan.com/ 2. 腾讯社交用户体验设计(ISUX) 地址:http://isux.tencent.c ...

  5. Linux install SMplayer

    sudo apt-add-repository ppa:rvm/smplayer sudo apt-get update sudo apt-get install smplayer smplayer- ...

  6. 【转载】Linux 信号列表

    转自:http://blog.csdn.net/muge0913/article/details/7322710 信号及其简介 信号是一种进程通信的方法,他应用于异步事件的处理.信号的实现是一种软中断 ...

  7. 启用apache,发现80端口被占用【已解决】

    前段时间停止了Apache,结果在打开的时候发现无法打开,80端口被占用,于是win+r 运行cmd 输入netstat -ano 可以看到80端口被PID4占用,于是打开任务管理器-进程-查看,选择 ...

  8. dedecms有条件sql注入(x0day)

    https://www.t00ls.net/thread-35569-1-1.html http://localhost/dedecms/plus/advancedsearch.php?mid=1&a ...

  9. Oracle数据库坏块的恢复

    模拟数据块坏块: 对于发生数据块不一致的数据块,如果当前数据库有备份且处于归档模式,那么就可以利用rman工具数据块恢复功能 对数据块进行恢复,这种方法最简单有效,而且可以在数据文件在线时进行,不会发 ...

  10. JS for循环 闭包

    对于for循环的闭包问题的理解,认为需要理解函数中的变量的作用域链的概念 另外提及下变量提升的概念 如下例子: var ar = [];for(var i=1:i<10; i++){ ar[i] ...