题目链接:点击查看

题目大意:在一个二维平面上,给出一个初始点 P ,接下来给出 n 个点当做靶子,现在初始节点会射击每个靶子,我们可以进行的操作是在 x 轴或 y 轴上建造一段连续长度的木板,使得初始点 P 无法射击到木板后方的靶子,规定木板只能在 x 轴或 y 轴上建造连续的一段,不许拐弯,问最短需要建造多长的木板,才能让点 P 最多只能射击到 k 个靶子,如果无解,输出 -1

题目分析:简单的几何问题+贪心,比赛的时候忘记贪心了,结果改来改去还是一直WA,题目给出的点永远都不会在坐标轴上,那么我们可以先给每个点进行分类:

  1. 与点 P 在同一象限的点
  2. 与点 P 以 x 轴分隔的点
  3. 与点 P 以 y 轴分隔的点

分好类后,首先特判 -1 的情况,就是当我们盖住 x 轴另一侧的所有点或 y 轴另一侧的所有点后,还是无法满足剩余的点小于等于 k,那么此时肯定是输出 -1,接下来利用直线相交的模板,分别计算出点 P 与 x 轴另一侧的每个点与 x 轴的交点,并以此排序,显然用木板盖住连续相邻的点是最优的情况,我们计算一下还需要删掉多少个点,遍历一下所有点在维护一下最小值就是答案了,代码的话可能看起来比较吓人,其实是为了方便理清思路才把每个变量的名字都写的那么长的

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=3e5+100;const double eps = 1e-10;int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1;
}struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//叉积double operator ^(const Point &b)const{return x*b.y - y*b.x;}//点积double operator *(const Point &b)const{return x*b.x + y*b.y;}
};struct Line{Point s,e;Line(){}Line(Point _s,Point _e){s = _s;e = _e;}//`求两直线的交点`//`要保证两直线不平行或重合`Point crosspoint(Line v){double a1 = (v.e-v.s)^(s-v.s);double a2 = (v.e-v.s)^(e-v.s);return Point((s.x*a2-e.x*a1)/(a2-a1),(s.y*a2-e.y*a1)/(a2-a1));}
};vector<Point>_1,_2,_3;//1:同一象限内 2:y轴另一侧 3:x轴另一侧 int main()
{
//#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//#endif
//  ios::sync_with_stdio(false);Point point,temp;point.input();int n,k;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){temp.input();if((sgn(temp.x*point.x)>0&&sgn(temp.y*point.y)>0))//位于同一象限 _1.push_back(temp);if((sgn(temp.x*point.x)<0))//位于y轴另一侧 _2.push_back(temp);if((sgn(temp.y*point.y)<0))//位于x轴另一侧 _3.push_back(temp);}if(n-max(_2.size(),_3.size())>k)puts("-1");else{vector<double>point_y,point_x;int len=(n-_1.size())-(k-_1.size());//还需要删掉这么多点才行 double ans=1e10;for(int i=0;i<_2.size();i++)//计算跨y轴的木板长度(在y轴上){Point temp=Line(point,_2[i]).crosspoint(Line(Point(0,0),Point(0,1)));point_y.push_back(temp.y);} sort(point_y.begin(),point_y.end());for(int i=0;i+len-1<point_y.size();i++)ans=min(ans,point_y[i+len-1]-point_y[i]);for(int i=0;i<_3.size();i++)//计算跨x轴的木板长度(在x轴上){Point temp=Line(point,_3[i]).crosspoint(Line(Point(0,0),Point(1,0)));point_x.push_back(temp.x);}sort(point_x.begin(),point_x.end());for(int i=0;i+len-1<point_x.size();i++)ans=min(ans,point_x[i+len-1]-point_x[i]);printf("%f\n",ans);}return 0;
}

牛客 - umi和弓道(几何+贪心)相关推荐

  1. 牛客 华华听月月唱歌 贪心

    https://ac.nowcoder.com/acm/contest/392/A 链接:https://ac.nowcoder.com/acm/contest/392/A 来源:牛客网 题目描述 月 ...

  2. 2021牛客多校10 - Train Wreck(贪心)

    题目链接:点击查看 题目大意:给出一个合法的括号序列,再给出 nnn 个数字,括号序列对应着入栈和出栈,问是否存在一个合法的顺序,使得 nnn 个数字按照括号序列操作后,每次入栈后,栈中的序列都是不同 ...

  3. 牛客 - 「土」巨石滚滚(贪心)

    题目链接:点击查看 题目大意:给出一个土球,初始时的稳定性为m,现在需要撞击n个障碍,每撞击掉第i个障碍物后,会降低a[i]的稳定性,但会增加b[i]的稳定性,若土球的稳定性小于0,则会直接散架,问能 ...

  4. 【Nowcoder】牛客小白月赛26 H 保卫家园 | 贪心、扫描线

    emmm-考试周一天一套小白月赛保持手感- 别问为什么,怕被太难的题卡的挂科- 本来不想写什么题解,不过这题确实有妙处,就记录一下吧 题目大意: 为了抵御深渊的蔓延,被深渊毁掉家园的人们组建法兰不死队 ...

  5. 牛客多校2 - Boundary(几何)

    题目链接:点击查看 题目大意:给出 n 个点,需要我们选择一个经过原点的圆,使得这个圆经过尽可能多的点,输出最多可以经过多少个点 题目分析:n 的大小是 2000 ,显然支持 n * n 最多再加一个 ...

  6. 牛客 - 奇怪的背包问题增加了(贪心)

    题目链接:点击查看 题目大意:中文题意 题目分析: 代码: #include<iostream> #include<cstdio> #include<string> ...

  7. 牛客国庆集训派对day6TJ-DefenseTower【贪心】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/1111/J 题目大意 一棵树,每个点有一个威力值,每次破坏一个点会受到与它相连没有破坏的点的威力值之和的伤害. ...

  8. 牛客网数量关系8道、判断推理8道、智力题8道

    1.一堂考试试卷上画了五大洲的图形,每个图形都编了号,要求填出其中任意两个洲名. 甲填:3是欧洲,2是美洲 乙填:4是亚洲,2是大洋洲 丙填:1是亚洲,5是非洲 丁填:4是非洲,3是大洋洲 戊填:2是 ...

  9. C语言入门必刷题-牛客网精选5道

    目录 1.BC12 学生基本信息输入输出 2.BC89 包含数字9的数 3.BC29 开学? 4.BC77 简单计算器 5.BC140 杨辉三角 1.BC12 学生基本信息输入输出 描述 依次输入一个 ...

最新文章

  1. Abra宣布对BCH的原生支持
  2. SilverLight4:在MVVM架构下实现模式窗口
  3. JUC并发编程六 并发架构--偏向锁
  4. 数字信号处理第一章 离散时间信号与系统
  5. java token生成和验证_java生成定长度的随机验证码
  6. Spring Cloud + Spring Boot + Mybatis + shiro + RestFul + 微服务
  7. 不小心关闭了explorer.exe进程,桌面变白解决办法
  8. Spring MVC定制用户登录注销实现示例
  9. MySQL数据库模式(SQL_MODE)中的STRICT_TRANS_TABLES和STRICT_ALL_TABLES
  10. 使用 idea 创建第一个 springboot 项目
  11. 电影混混天团经典的台词
  12. 数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)
  13. mysql集群和memcached_Memcached 高可用集群架构
  14. mx250显卡天梯图_MX250相当于什么显卡?来看显卡天梯图
  15. c语言齿轮标准模数选择编程,齿轮参数术语计算模数选择
  16. ddos防火墙的作用和部署
  17. 基于Pygame的中国象棋的制作(China Chess)
  18. 多张图片合成一张jpg工具_将多张图片合并成一张图片的小工具Collagerator
  19. C/C++ tip: How to detect the operating system type using compiler predefined macros
  20. 枚举,随机数模型,函数功能分解---扔骰子随机数游戏

热门文章

  1. java buffer 记事本_Java实现记事本|IO流/GUI
  2. NofairSync.tryAcquire
  3. 函数式接口作为方法的参数【应用】
  4. 读写锁的由奢入俭“易”
  5. 常用的函数式接口_Function接口
  6. MapReduce-流量统计求和-步骤分析
  7. XMLIOC案例-编写spring的Ioc配置
  8. 事务与分布式事务原理与实现
  9. mysql导入多条数据语句_MySQL插入多条记录和REPLACE语句
  10. webflux系列--reactor源码(一)