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

题目链接:nyoj 78

题目讲解:本题考查的主要是凸包的用法,算是入门级的吧,当然前提是你接触过,平面几何:

AC代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<vector>
 6 using namespace std;
 7 struct T
 8 {
 9     int x,y;
10     friend int operator < (T a, T b)
11 {
12     if((a.x<b.x) || (a.x==b.x && a.y<b.y))
13         return 1;
14     return 0;
15 }
16 }a[105],ans[105];
17 //用来判断第三点在当前两点构成的直线的左侧还是右侧,右侧返回值小于0;
18 double judge(T a, T b,T c)
19 {
20   return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
21 }
22 int main()
23 {
24   int T,m;
25   scanf("%d",&T);
26   while(T--)
27   {
28
29       scanf("%d",&m);
30       for(int i=0; i<m; i++)
31       {
32         scanf("%d %d",&a[i].x,&a[i].y);
33       }
34    sort(a,a+m);
35    int k1=0;
36    for(int i=0; i<m; i++)//下凸包,从下面扫描个点;
37    {
38        while(k1>1 && judge(ans[k1-2],ans[k1-1],a[i])<=0)
39        {
40             k1--;
41        }
42      ans[k1++]=a[i];
43    }
44     int k2=k1;
45     for(int i=m-1; i>=0; i--)//上凸包,从上面扫描各点;
46    {
47        while(k1>k2 && judge(ans[k1-2],ans[k1-1],a[i])<=0)
48        {
49             k1--;
50        }
51      ans[k1++]=a[i];
52    }
53    k1--;
54    sort(ans,ans+k1);
55    for(int i=0; i<k1; i++)
56     printf("%d %d\n",ans[i].x,ans[i].y);
57   }
58   return 0;
59 }
时间: 2024-10-02 03:15:33

NYOJ 78 圈水池 (入门级凸包)的相关文章

NYOJ 78 圈水池( 凸包入门)

链接:click here 题目:有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水,各个水池都标有各自的坐标,现在要你写一个程序利用最短的篱笆将这些供水装置圈起来!(篱笆足够多,并且长度可变) 输出各个篱笆经过各个供水装置的坐标点,并且按照x轴坐标值从小到大输出,如果x轴坐标值相同,再安照y轴坐标值从小到大输出 样例输入 1 4 0 0 1 1 2 3 3 0 样例输出 0 0 2 3 3 0 凸包Graham模板:详细讲解:click

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

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

nyist 78 圈水池

http://acm.nyist.net/JudgeOnline/problem.php?pid=78 圈水池 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水,各个水池都标有各自的坐标,现在要你写一个程序利用最短的篱笆将这些供水装置圈起来!(篱笆足够多,并且长度可变) 输入 第一行输入的是N,代表用N组测试数据(1<=N<=10)第二行输入的是m,代表本组

圈水池(凸包入门)

圈水池 时间限制:3000 ms  |           内存限制:65535 KB 难度:4 描述 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水,各个水池都标有各自的坐标,现在要你写一个程序利用最短的篱笆将这些供水装置圈起来!(篱笆足够多,并且长度可变) 输入 第一行输入的是N,代表用N组测试数据(1<=N<=10) 第二行输入的是m,代表本组测试数据共有m个供水装置(3<=m<=100) 接下来m行代表的是各个供

NYOJ 圈水池

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; struct node { int x,y; }; node vex[1000];//存入的所有的点 node stackk[1000];//凸包中所有的点 int xx,yy; bool cmp1(node a,node b)

【COGS &amp; USACO】896. 圈奶牛(凸包)

http://cojs.tk/cogs/problem/problem.php?pid=896 我的计算几何入门题... 看了看白书的计算几何部分,,恩好嘛.. 乃们都用向量!!!! 干嘛非要将2个点确定一条线变成一个点从原点o出发的射线!!!! 这就是所谓的玩概念吗 然后用所谓的向量加减,是这些向量起点相同,然后就变成了原点o出发的射线!!! 然后你们还在玩概念!我跪了. (以上纯属蒟蒻吐槽) 好吧,计算几何非常有用的..简化了不少操作. 这里还有啥点积啥叉积.点积就是同一起点的向量(终点)的

NYOJ题目27水池数目

--------------------------------------------- 这道题有点坑,也怪我总是有点马虎,按照正常人的思维0是表示有水池啊竟然是1表示有水池,最坑的是写反了竟然还能过样例一直以为是自己程序问题review了好多遍.... 图论基础题,染色法即可. AC代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new

nyoj253LK的旅行(旋转卡壳法)

LK的旅行 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 LK最近要去某几个地方旅行,她从地图上计划了几个点,并且用笔点了出来,准备在五一假期去这几个城市旅行.现在希望你找出她点的所有的点中距离最远的两个点的距离是多少.各个景点可以认为是在一个平面上. 输入 第一行有一个整数0<n<10表示测试数据的组数随后的n组数据中,第一行有一个整数3<m<100000表示有m个旅游景点.随后的m行每行有两个整数,分别表示每一个点的x和y.景点坐标中可能有重复的

浅谈凸包之Andrew 与 Graham

前言 脑补知识点: 1.向量的内积(数量积,点乘): 公式:a· b = |a| * |b| cos<a, b>=a.x* b.y + b.x * a.y 2.向量的外积(向量积,差乘): 公式:|c|= |a|*|b|*sin<a, b> = a.x * b.y - b.x * a.y 点在多边形内判定 多边形: 就是二维平面上被一系列首尾相接.闭合的折线段围成的区域 在程序中一般用定点数组表示 其中各个定点按照逆时针顺序排序 问: 给你一个点 如何判断它是在多边形内 呢? 1.