Gym 100169E Tetrahedron Inequality
大致题意:
给出六条边,判断是否能组成四面体
分析:
四面体由四个三角形组成,所以每一条边肯定要符合三角形的任意两边大于第三边的性质。一开始以为这样判断就可以了,然而这题并没有这么简单。
如右图,有四个三角形,六条边,但是并不是四面体
如下图,先选择五条边(绿色的五条边),然后展开成一个平面,三角形ABC和三角形ACD不重叠(重叠),此时只要将三角形ABC绕着AC轴旋转,BD即第六条边。所以展开成平面可求除最大值(最小值)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <cmath>
using namespace std; const int maxn=10000+5;
int a[6];
int edge[6];
bool flag[6]; bool isTriangle(int x,int y,int z)
{
return x+y>z && x+z>y && y+z>x;
}
bool isTetrahedron()
{
double BD=edge[0]/1000.0;
double AB=edge[1]/1000.0;
double AD=edge[2]/1000.0;
double CD=edge[3]/1000.0;
double BC=edge[4]/1000.0;
double AC=edge[5]/1000.0; //方法一:角度数求出来
double ABD=acos((AB*AB+BD*BD-AD*AD)/(2*AB*BD));
double CBD=acos((BC*BC+BD*BD-CD*CD)/(2*BC*BD));
double minAC=sqrt(AB*AB+BC*BC-2*AB*BC*cos(ABD+CBD));
double maxAC=sqrt(AB*AB+BC*BC-2*AB*BC*cos(ABD-CBD));
if(minAC>maxAC) swap(minAC,maxAC); //方法二:
/*double cosABD=(AB*AB+BD*BD-AD*AD)/(2*AB*BD);
double cosCBD=(BC*BC+BD*BD-CD*CD)/(2*BC*BD);
double sinABD=sqrt(1-cosABD*cosABD);
double sinCBD=sqrt(1-cosCBD*cosCBD);
double cosABC=cosABD*cosCBD-sinABD*sinCBD;
double maxAC=sqrt(AB*AB+BC*BC-2*AB*BC*cosABC);
cosABC=cosABD*cosCBD+sinABD*sinCBD;
double minAC=sqrt(AB*AB+BC*BC-2*AB*BC*cosABC);*/ return AC>minAC && AC<maxAC;
}
bool dfs(int cnt)
{
if(cnt==3)
if(!isTriangle(edge[0],edge[1],edge[2])) return false;
if(cnt==6)
return isTriangle(edge[0],edge[3],edge[4]) &&
isTriangle(edge[1],edge[4],edge[5]) &&
isTriangle(edge[2],edge[4],edge[5]) &&
isTetrahedron();
for(int i=0; i<6; i++)
if(!flag[i])
{
flag[i]=1;
edge[cnt]=a[i];
if(dfs(cnt+1)) return true;
flag[i]=0;
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
for(int i=0; i<6; i++)
scanf("%d",&a[i]);
memset(flag,0,sizeof(flag));
printf("%s\n",dfs(0)? "YES":"NO");
}
return 0;
}
Gym 100169E Tetrahedron Inequality的更多相关文章
- 地大邀请赛d
Problem D: Tetrahedron Inequality Time Limit: 1 Sec Memory Limit: 128 MB Submit: 15 Solved: 3 [ ...
- INEQUALITY BOOKS
来源:这里 Bất Đẳng Thức Luôn Có Một Sức Cuốn Hút Kinh Khủng, Một Số tài Liệu và Sách Bổ ích Cho Việc Học ...
- ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力
Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS Memory Limit:65536KB 64bit IO Fo ...
- ACM: Gym 101047K Training with Phuket's larvae - 思维题
Gym 101047K Training with Phuket's larvae Time Limit:2000MS Memory Limit:65536KB 64bit IO F ...
- ACM: Gym 101047E Escape from Ayutthaya - BFS
Gym 101047E Escape from Ayutthaya Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I6 ...
- ACM: Gym 101047B Renzo and the palindromic decoration - 手速题
Gym 101047B Renzo and the palindromic decoration Time Limit:2000MS Memory Limit:65536KB 64 ...
- Gym 101102J---Divisible Numbers(反推技巧题)
题目链接 http://codeforces.com/gym/101102/problem/J Description standard input/output You are given an a ...
- Gym 100917J---Judgement(01背包+bitset)
题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/outputStatements The jury ...
- Gym 100917J---dir -C(RMQ--ST)
题目链接 http://codeforces.com/gym/100917/problem/D problem description Famous Berland coder and IT mana ...
随机推荐
- node.js module初步理解-(转载)
在开发一个复杂的应用程序的时候,我们需要把各个功能拆分.封装到不同的文件,在需要的时候引用该文件.没人会写一个几万行代码的文件,这样在可读性.复用性和维护性上都很差,几乎所有的编程语言都有自己的模块组 ...
- Linux 用户管理_用户相关配置文件详解
linux的用户管理 linux支持多个用户同时使用同一个用户登陆系统,windows在修改组策略的情况下,也可以多个人使用同一个用户登陆. 远程连接Linux的方式:ssh 远程连接windows的 ...
- 30-- A 代码记录分析
张的代码 30-- -A if(BT_INFO.RX.CACHE == BT_RX_CACHE[0]) { BT_INFO.RX.CACHE = BT_RX_CACHE[1]; } else { B ...
- 11.7 iostat: I/O信息统计
iostat是I/O statistics(输入/输出统计)的缩写,其主要功能是对系统的磁盘I/O操作进行监视.它的输出主要是显示磁盘读写操作的统计信息,同时也会给出CPU的使用情况.同vmstat命 ...
- C语言的指针数组与指针数组
一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
- SystemVerilog数组(一)
- python 匹配中文字符
参考: http://hi.baidu.com/nivrrex/blog/item/e6ccaf511d0926888d543071.html http://topic.csdn. ...
- 西门子 S7-300 以太网模块连接 WINCC方案
北京华科远创科技有限研发的远创智控ETH-YC模块,型号有MPI-ETH-YC01和PPI-ETH-YC01,适用于西门子S7-200/S7-300/S7-400.SMART S7-200.西门子数控 ...
- Java日期时间API系列38-----一种高效的工作日计算计算方法
如果没有节日放假调休的话,工作日很好计算,周一到周五就是工作日,但因为有节日放假调休,使得这个计算需要外部放假安排数据来支持.计算原理: 先按照放假安排数据计算,再按照周一周五计算. 下面以Local ...
- 单线程service服务
1.@Service修饰类名,同时类继承Thread类 @Service public class MasterSchedulerService extends Thread { /** * logg ...