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 ...
随机推荐
- [东西]neverOpen
一.介绍 用于完成一项光荣而伟大的使命. 二.更新日志 当前版本:V5.0 - 20191107 --------------------------------------------------- ...
- hive中order by、distribute by、sort by和cluster by的区别和联系
hive中order by.distribute by.sort by和cluster by的区别和联系 order by order by 会对数据进行全局排序,和oracle和mysql等数据库中 ...
- UAC简介
用户帐户控制 (User Account Control) 是Windows Vista(及更高版本操作系统)中一组新的基础结构技术,可以帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统,同时也可以 ...
- JDK的小Bug你了解么?
用了这么长时间的JDK了,有没有老铁发现JDK的bug呢?从最早版本的JDK1.2到现在普及开的JDK1.8以来,JAVA经历了这么多年的风风雨雨,依然坚持在一线上,是不是感觉很神奇,但是,有没有多 ...
- 能耗监测平台GPRS通讯服务器的架构设计
在这个文章里面我将用一个实际的案例来分享如何来构建一个能够接受3000+个连接的GPRS通讯服务器软件.在这里,我将分享GPRS通讯服务器设计过程中面临的问题,分享通讯协议的设计,分享基于异步事件的设 ...
- LeetCode 557:反转字符串中的单词 III Reverse Words in a String III
公众号:爱写bug(ID:icodebugs) 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. Given a string, you need to reve ...
- 【shell脚本】不停地telnet一个ip或域名,并输出结果到文件中===telnetscript.sh
编写shell脚本不停地telnet一个域名,并输出结果到文件中 [root@localhost ~]# cat telnetscript.sh #!/bin/bash #检查是否在root用户下执行 ...
- vue+element 动态表单验证
公司最近的项目有个添加动态表单的需求,总结一下我在表单验证上遇到的一些坑. 如图是功能的需求,这个功能挺好实现的,但是表单验证真是耗费了我一些功夫. vue+element在表单验证上有一些限制,必须 ...
- decodeURIComponent 解码函数
想象一个场景,你朋友发一个链接让你打开,但链接是下面其中之一,你会不会想锤死他 1. \u0068\u0074\u0074\u0070\u003a\u002f\u002f\u0062\u0069\u0 ...
- 将服务器时间类型改为UTC(0000)
方法一: # timedatectl set-timezone UTC # timedatectl set-time "YYYY-MM-DD HH:MM:SS" # time ...