您的位置:首页 > 其它

NBUT 1665

2016-03-06 15:34 183 查看


Description

好奇的skyv95想要做一个正方形的木块,现在有三种颜色的矩形木块,颜色分别为"A","B","C"。他现在很想把三个木块拼接成一个大正方形,现在求助于你们,问分别给你们三种颜色矩形的两个边长,判断是否能组成一个正方形。

Input

依次输入颜色为A的矩形的两边长度,颜色为B的矩形的两边长度,颜色为C的矩形的两边长度。

Output

可以输出"YES",否则输出"NO"。

Sample Input

4 4 2 6 4 2


Sample Output

YES


Hint

例子的图像可以是这样
6
BBBBBB
BBBBBB
AAAACC
AAAACC
AAAACC
AAAACC


主要分两种情况,看似比较简单的数学题,但做起来比较麻烦,
分两种情况,第一种三个矩形的长都等于拼成正方形的边,这一种比较简单,第二种比较复杂,只有一个矩形的长或宽等于正方形的边长,主要在于另外两个矩形的长或宽加这个矩形的长和宽 一定等于正方形的边长
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int a[10],ans,i,j,k,l;
int main()
{
while(scanf("%d",&a[0])!=EOF)
{
int help=0;
l=0;
ans=0;
for(i=1;i<6;i++)
scanf("%d",&a[i]);
for(i=0;i<3;i++)
ans+=a[i*2]*a[2*i+1];
k=sqrt(ans);//先求出边长
if(k*k!=ans)
{
printf("NO\n");
continue;
}
for(i=0;i<6;i++)
{
if(a[i]>k)
help=1;//如果有一条边的长度大于边长,那么肯定不行
l=max(a[i],l);//找到最长的边
}
if(l!=k)//如果最长的边大于了边长,这一句可以不写
help=1;
j=0;//找到 长度等于边长的边的个数
for(i=0;i<6;i++)
if(a[i]==l)
j++;
if(j==2)//如果 长度为边长的边的个数为2   那么肯定不行
help=1;
if(j==3)//如果有3 个 为情况1 ,因为原来已经算过正方形的面积,所以此时一定满足
{
printf("YES\n");
continue;
}
if(help==1)
{
printf("NO\n");
continue;
}
int cnt;
if(j==1)//如果有1 个  为情况2
{
for(i=0;i<6;i++)
if(a[i]==l)
cnt=i;
}
int nmd;
int flag=0;
if(cnt%2==0) //这个是确定  等于边长的那条边的第几个矩形的长还是宽
//如果是长
nmd=cnt+1;
//如果是宽
if(cnt%2==1)
nmd=cnt-1;
for(i=0;i<3;i++)
{
if(i*2==cnt||i*2+1==cnt)//判断另外两个矩形的长或宽加这个矩形那个不等于边长的边 是否为正方形的边
continue;
if(a[i*2]+a[nmd]==l)
flag=1;
if(a[i*2+1]+a[nmd]==l)
flag=1;
}
if(flag==1)
{
printf("YES\n");
continue;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: