首页 > 其他分享 >【计算几何】Magic Rabbit

【计算几何】Magic Rabbit

时间:2024-04-24 14:11:19浏览次数:38  
标签:Magic pt Point int Tr Rabbit 几何 三角形 药水

题意:

有两种元素A和B,和三种不同元素比例的药水,问对于给定的X和Y,能不能利用这三种药水配出元素比例为X:Y的药水
药水可以无限取用

思路:

第一眼看上去以为是个背包或者数学(((遁
后来发现所有能被配出的比例都是这三种药水所围成的三角形之中,从而转化成计算几何问题:如何判断一个点与一个三角形的位置关系

原本我理解的判断位置关系:凸多边形逆时针存储各顶点,然后to-left检测n次
但是题目给定的三个比例并不能一定满足逆时针顺序,进而发现,如果顺时针的话就是to-right,总之点对于所有的直线的关系都一致
Warning:注意退化的情况

不精确的感性证明:

首先先试图举反例,假设这两种元素分别为盐和糖,如果我想要的水比最咸的水还要咸的话显然不能调配出来
接着证明在三角形边上的一定内配出来:众所周知,水多了加面,面多了加水
最后证明三角形内部的一定能配出来:转化成一个点和它的对边...

code:

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
struct Point{
	int x,y;
};
struct Triangle{
	Point p[3];
}Tr;
int to_left(Point a,Point b,Point c){
	Point X={b.x-a.x,b.y-a.y},Y={c.x-a.x,c.y-a.y};
	int ans=X.x*Y.y-X.y*Y.x;//差积
    if(abs(ans)<eps)return 0;//在直线上
    else if(ans>0)return 1;//在直线左侧
    return -1;//在直线右侧
}
signed main(){
	for(int i=0;i<3;i++){
		cin>>Tr.p[i].x>>Tr.p[i].y;
	}
	int n;
	cin>>n;
	Point pt;
	while(n--){
		cin>>pt.x>>pt.y;
		int f1=0,f2=0,f=0;
		for(int i=0;i<3;i++){
			int res=to_left(Tr.p[i],Tr.p[(i+1)%3],pt);
			if(res==1)f1++;
			else if(res==-1)f2++;
			else{
				if(pt.x>=min(Tr.p[i].x,Tr.p[(i+1)%3].x) && pt.x<=max(Tr.p[i].x,Tr.p[(i+1)%3].x) && pt.y>=min(Tr.p[i].y,Tr.p[(i+1)%3].y) && pt.y<=max(Tr.p[i].y,Tr.p[(i+1)%3].y)){
					f=1;
                }
			}
		}
		if(f1==3 || f2==3 || f==1)cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
}

标签:Magic,pt,Point,int,Tr,Rabbit,几何,三角形,药水
From: https://www.cnblogs.com/muyi-meow/p/18155164

相关文章

  • 【计算几何】二维基础 (丑陋的)板子
    符号判断与大小比较intsgn(intx){ if(fabs(x)<eps)return0; elseif(x>=eps)return1; elsereturn-1;}//实数的向上取整函数int_ceil(constdouble&x){longlongk=ceil(x);while(k<x)k++;while(k>x+1)k--;returnk;}点structPoint......
  • 三线共点和三点共线问题 | 立体几何
    前言平面的三条基本性质,也叫三条公理:基本事实1:过不在一条直线上的三个点,有且只有一个平面.基本事实2:如果一条直线上的两个点在一个平面内,那么这条直线在这个平面内.基本事实3:如果两个不重合的平面有一个公共点,那么它们有且只有一条过该点的公共直线.平面的基本性......
  • docker安装rabbitmq
    拉取镜像dockerpullrabbitmq:3.12.12运行容器cd/usr/local/dockerdockerrun-d--namerabbitmq3.12.12-p5672:5672-p15672:15672-v`pwd`/data:/var/lib/rabbitmq--hostnamemyRabbit-eRABBITMQ_DEFAULT_VHOST=my_vhost-eRABBITMQ_DEFAULT_USER=admin-e......
  • Rabbitmq 发送者Ack+持久化
     rabbitmq数据不丢失需要满足以下几点:(开启持久化后rabbitmq性能会下降)生产者confirm消息确认机制rabbitmq的交换机,队列,消息设置为持久化关闭消费者的自动ack换为手动ack1publicfunctionproducer(){2$exchange="topic-text";3$type="topic";......
  • kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ consumer实战
    1、上一节课我们学习了MQTTproducer生产者步骤,MQTTconsumer消费者步骤。该步骤可以从支持MRQTT协议的中间件获取数据,该步骤和kafkaconsumer一样可以处理实时数据交互,如下图所示: 2、双击步骤打开MQTTconsumer配置窗口,如下图所示:Stepname:自定义步骤名称。Transformat......
  • kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ producer 实战
    1、MQTT介绍MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,设计用于连接低带宽、高延迟或不可靠网络的设备。MQTT是基于发布/订阅模式(Publish/Subscribe)的协议,其中设备可以发布消息到一个主题(Topic),其他设备可以订阅这个主题以接收相关消息。这种模式......
  • 解析几何简单计算
    设点设线例题1题目已知椭圆方程\(\dfrac{x^2}{4}+y^2=1\),设直线\(l\),不经过点\(P(0,1)\)且与椭圆相交于\(A,B\)两点,若直线\(PA\)与直线\(PB\)的斜率和为\(-1\),证明:直线\(l\)过定点。题解由直线\(l\)不过点\(P(0,1)\)可设直线\(l\)方程:\(mx+n(y-1)=1\)......
  • 射影几何学笔记
    给大家拉坨大的。在中学阶段,我们就研究过欧几里得平面上的几何。在初中阶段我们学习了平移与旋转,在高中阶段我们学习了仿射,这些几何变换有一个共同点:保持共线三点与共点三线在变换后仍共线或共点。然而在生活中,除了这些变换以外,还有更一般的变换也拥有这个性质:比如,我们在空中对着......
  • 【计算几何】牛客专题第二章 二维基础
    元素的表示点1.复数类·complex<int/duble>·特点:慢,自带各种运算,不怎么用2.pair·自带排序·自由度不高·基本不在几何题目中使用3.结构体(推荐,常用)自由度高,成员函数,重载运算符structPoint{ doublex,y;};向量(直接用Point)向量点积与几何意义及应用\vec{......
  • 开源Python几何约束求解器GeoSolver
    GeoSolver是一个用于几何约束求解的Python包。几何约束问题(GCP)是几何变量上/之间的一组几何约束。问题是找到几何变量的配置以满足所有约束。几何变量是位置、方向、形状、大小等未知的对象。GCP中的变量可以是点、线、平面、球体、圆柱体和更复杂的形状。几何约束是诸如对象......