CF13B Letter A
CF13B Letter A
题目描述
Little Petya learns how to write. The teacher gave pupils the task to write the letter AA on the sheet of paper. It is required to check whether Petya really had written the letter AA .
You are given three segments on the plane. They form the letter AA if the following conditions hold:
- Two segments have common endpoint (lets call these segments first and second), while the third segment connects two points on the different segments.
- The angle between the first and the second segments is greater than 00 and do not exceed 9090 degrees.
- The third segment divides each of the first two segments in proportion not less than 1/41/4 (i.e. the ratio of the length of the shortest part to the length of the longest part is not less than 1/41/4 ).
输入格式
The first line contains one integer tt ( 1<=t<=100001<=t<=10000 ) — the number of test cases to solve. Each case consists of three lines. Each of these three lines contains four space-separated integers — coordinates of the endpoints of one of the segments. All coordinates do not exceed 10^{8}108 by absolute value. All segments have positive length.
输出格式
Output one line for each test case. Print «YES» (without quotes), if the segments form the letter AA and «NO» otherwise.
题意翻译
给定三条线段,请你判断这三条线段能否组成字母'A' 判定条件 1.其中的两条线段有共同的端点(我们暂且称它们为第一条,第二条线段),第三条线段的端点分别在这两条不同的线段上。 2.第一条和第二条线段的夹角必须大于0度小于等于90度。 3.第三条线段截得的另外两条线段的较小长度与较大长度的比值必须大于等于1/4。 输入:第一行一个整数t,下面3*t行每三行为一组数据,代表三条线段,每一行代表的是一条线段两个端点的坐标 输出:对于每一组数据,输出"YES"如果能组成'A',否则输出"NO" 感谢 @稀神探女 提供的翻译。
输入输出样例
输入 #1复制
输出 #1复制
题解:
本蒟蒻人生中的第一道黑题
一道复杂的模拟,其中掺杂了许些计算几何的风情。
其实涉及到的计算几何就是一点点的解析几何,判断三点共线,判断夹角小于90°,判断线段差分比例小于\(\frac{1}{4}\)。
求角小于90°的时候运用了叉积,需要平面向量的相关知识,不懂的同学请自行百度。
比较恶心的判断是差分比例小于\(\frac{1}{4}\)。让我来讲一下——
算了不讲了,看代码吧,模拟的思想还是比较简单的,相信大家能看明白。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
int x,y,j,k;
}a[10];
int t,x,y,m,n,p,q,x1,yy,x2,y2,c1,c2,flag;
int check_oneline(int a,int b,int c,int d,int e,int f)
{
if((ll)(f-b)*(c-a)==(ll)(d-b)*(e-a))
return 1;
return 0;
}
int check_angle(int x,int y,int a,int b,int p,int q)
{
if((ll)(a-x)*(p-x)+(ll)(b-y)*(q-y)<0)
return 0;
return 1;
}
int check_subseg(int x,int y,int m,int n,int a,int b)
{
if(x!=a)
{
if(a>x)
{
if((a-x)*5<(m-x))
return 0;
if((a-x)*5>(m-x)*4)
return 0;
return 1;
}
else
{
if((x-a)*5<(x-m))
return 0;
if((x-a)*5>(x-m)*4)
return 0;
return 1;
}
}
else
{
if(b>y)
{
if((b-y)*5<(n-y))
return 0;
if((b-y)*5>(n-y)*4)
return 0;
return 1;
}
else
{
if((y-b)*5<(y-n))
return 0;
if((y-b)*5>(y-n)*4)
return 0;
return 1;
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i=1;i<=3;i++)
scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].j,&a[i].k);
for(int i=1;i<=2;i++)
for(int j=i+1;j<=3;j++)
{
if(a[i].x==a[j].x&&a[i].y==a[j].y)
{
x=a[i].x,y=a[i].y;
m=a[i].j,n=a[i].k;
p=a[j].j,q=a[j].k;
c1=i,c2=j;
}
else if(a[i].x==a[j].j&&a[i].y==a[j].k)
{
x=a[i].x,y=a[i].y;
m=a[i].j,n=a[i].k;
p=a[j].x,q=a[j].y;
c1=i,c2=j;
}
else if(a[i].j==a[j].j&&a[i].k==a[j].k)
{
x=a[i].j,y=a[i].k;
m=a[i].x,n=a[i].y;
p=a[j].x,q=a[j].y;
c1=i,c2=j;
}
else if(a[i].j==a[j].x&&a[i].k==a[j].y)
{
x=a[i].j,y=a[i].k;
m=a[i].x,n=a[i].y;
p=a[j].j,q=a[j].k;
c1=i,c2=j;
}
}
for(int i=1;i<=3;i++)
if(i!=c1&&i!=c2)
{
x1=a[i].x,yy=a[i].y,x2=a[i].j,y2=a[i].k;
break;
}
flag=1;
if(check_angle(x,y,m,n,p,q)==0)
flag=0;
if(flag)
{
if(check_oneline(x,y,m,n,x1,yy)&&check_oneline(x,y,p,q,x2,y2))
{
if(check_subseg(x,y,m,n,x1,yy)==0)
flag=0;
if(check_subseg(x,y,p,q,x2,y2)==0)
flag=0;
}
else if(check_oneline(x,y,p,q,x1,yy)&&check_oneline(x,y,m,n,x2,y2))
{
if(check_subseg(x,y,m,n,x2,y2)==0)
flag=0;
if(check_subseg(x,y,p,q,x1,yy)==0)
flag=0;
}
else
flag=0;
}
printf(flag?"YES\n":"NO\n");
}
return 0;
}
CF13B Letter A的更多相关文章
- cf13B Letter A(分类+简单计算几何,,)
题意: 给三个线段(每个线段的两个端点的坐标),问这三个线段能否组成字母A. 组成字母A的条件: 1.两个线段有公共端点. 2.这两个线段夹角小于等于90度. 3.第三个线段的两个端点分别在这两个线段 ...
- [LeetCode] Letter Combinations of a Phone Number 电话号码的字母组合
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- 17. Letter Combinations of a Phone Number
题目: Given a digit string, return all possible letter combinations that the number could represent. A ...
- 什么是Unicode letter
起因:从一段代码说起 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- LeetCode——Letter Combinations of a Phone Number
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- No.017:Letter Combinations of a Phone Number
问题: Given a digit string, return all possible letter combinations that the number could represent.A ...
- SCI/EI期刊投稿 Reply Letter 常用格式总结
SCI/EI期刊投稿Reply Letter常用格式总结 整个论文投稿的过程中,会遇到各种问题,需要我们向主编询问或是回复.下面主要总结了responses to the comme ...
- 【leetcode】 Letter Combinations of a Phone Number(middle)
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- [LeetCode] Letter Combinations of a Phone Number
Given a digit string, return all possible letter combinations that the number could represent. A map ...
随机推荐
- AtCoder Beginner Contest 147
A - Blackjack #include <bits/stdc++.h> int main() { int a, b, c; scanf("%d%d%d", &am ...
- mysql数据库的创建问题
数据库客户端工具navicate 1.使用create database语句创建数据库 (1)指定字符集 create [database|schema ]if not exists 数据库名 def ...
- 十二、深入理解Java内存模型
深入理解Java内存模型 [1]CPU和缓存的一致性 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道.而计算机上面的数据,是存放在主存当 ...
- ELK 框架整体流程编写 以及logstash脚本编写
Elasticsearch Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析.它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引 ...
- webpack-实用的2个配置
①:运行npm run dev 后自动打开浏览器 首先找到config里面的index.js文件,然后打开找到autoOpenBrowser属性,把默认的false改为true即可 ②:简写路径 ...
- SpringBoot 整合RabbitMQ错误记录
1. 控制台报错:Exception in thread "main" java.io.IOException…… Caused by: com.rabbitmq.client.S ...
- dubbo(提供者、消费者)基于java的实现
1.安装好jdk.zookeeper以后可以尝试开发代码进行dubbo的学习和练习. 首先创建Dubbo的Provider配置.创建一个maven project工程. RPC框架,不希望Consum ...
- SQL Server中使用SQL语句关闭数据库连接和删除数据库文件
有时候我们想用DROP DATABASE语句删除数据库和数据库文件,会删不掉,因为有其他人正在使用要删除的数据库,这里有一个方法可以强制断开其它数据库连接,再删除数据库. 假如我们要删除的数据库是[T ...
- abstract,virtual,override
1.abstract 可以修饰类和方法,修饰方法时只声明不实现: 2.继承实现abstract类必须通过override实现abstract声明的方法,而virtual方法可选择override(重写 ...
- B-Tree详解
之前写过一篇关于索引的文章<SQL夯实基础(五):索引的数据结构>,这次我们主要详细讨论下B-Tree. B-树 B-tree,即B树,而不要读成B减树,它是一种多路搜索树(并不是二叉的) ...