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 ...
随机推荐
- arduino (3) 控制sim900A发送短信
狗屎佳世通旗舰店,卖的什么破玩意sim900a芯片,不支持联通卡,还生明模块支持双卡的 之前买的esp8266-07都是内存偷工减料 买的液体浊度传感器给的原理图也不给基本接线. 差评垃圾店,你敢卖就 ...
- 10.7 csp-s模拟测试63 Median+Game+Park
我堕落了 我觉得任牛逼的问题也是我的问题 T1 Median T2 Game T3 Park
- Loadrunner 进行压力测试 并发测试
问题背景: 今年公司项目进行Saas化转型,在中间遇到很多问题,其中之一就是 Saas化后多租户的性能 和 并发问题.公司让我来调研和重现问题,通过调研总结了一些经验教训,分享给大家. 环境: Loa ...
- CSS3实现文字描边的2种方法
问题 最近遇到一个需求,需要实现文字的描边效果,如下图 解决方法一 首先想到去看CSS3有没有什么属性可以实现,后来被我找到了text-stroke 该属性是一个复 ...
- 七道常见的Redis面试题分享(含个人解答)
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里以面试题的形式对 Redis 常见问题做 ...
- git 创建标签 tag
1. git tag <name>就可以打一个新标签 加上-a参数来创建一个带备注的tag,备注信息由-m指定.如果你未传入-m则创建过程系统会自动为你打开编辑器让你填写备注信息. git ...
- 关于5G手机使用4G套餐扫盲
有些人说换5G手机用4G套餐不用5G套餐可以享受最高 300 mbps 的签约速率.在此我来给你们科普下. 5G套餐分为 500 mbps 和 1000 mbps 两种.且都享受优先接入,顺序是 10 ...
- Vertx和Jersey集成使用
为了更好地解耦和提高性能,一般将工程的接口部分剥离出来形成一个单独的工程,这样不仅能提高性能,增强可维护性,并且在后台工程宕掉的话对客户端接口的影响较小. 公司使用了Vertx和Jersey,Vert ...
- 执行http脚本
Invoke-Expression (Invoke-WebRequest http://10.16.2.5:81/Configcmd.ps1).content
- shell编程基本语法和变量
一.编写shell脚本基本格式 拿最简单的hello word举例 .#!/bin/bash echo 'hello world' .#!/bin/bash:告诉计算机,使用bash解释器来执行代码 ...