ningbooj--1655--木块拼接(贪心)
[1655] 木块拼接
时间限制: 1000 ms 内存限制: 65535 K
问题描述
好奇的skyv95想要做一个正方形的木块,现在有三种颜色的矩形木块,颜色分别为"A","B","C"。他现在很想把三个木块拼接成一个大正方形,现在求助于你们,问分别给你们三种颜色矩形的两个边长,判断是否能组成一个正方形。
依次输入颜色为A的矩形的两边长度,颜色为B的矩形的两边长度,颜色为C的矩形的两边长度。
可以输出"YES",否则输出"NO"。
4 4 2 6 4 2
YES
例子的图像可以是这样 6 BBBBBB BBBBBB AAAACC AAAACC AAAACC AAAACC
By&Recoder
有两种情况,一种是三个并排,另一种是一个在上,然后下边的拼接,拼接的两个必须有一条边相等,并且相等的边加上上方的长方形短边等于长边
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; struct node { int a,b; }p[5]; int cmp(node s1,node s2) { if(s1.a==s2.a) return s1.b>s2.b; return s1.a>s2.a; } int main() { while(cin>>p[0].a>>p[0].b>>p[1].a>>p[1].b>>p[2].a>>p[2].b) { int flag=-1; int maxx=-1,a=0,b=0; for(int i=0;i<3;i++) { if(p[i].a>maxx||p[i].b>maxx) { maxx=max(p[i].a,p[i].b); flag=i; } } bool f=false; int ans=0; for(int i=0;i<3;i++) { if(p[i].a==maxx||p[i].b==maxx) ans++; if(p[i].a<p[i].b) swap(p[i].a,p[i].b); } if(ans==3) { int sum=0; for(int i=0;i<3;i++) if(p[i].a==maxx) sum+=p[i].b; else sum+=p[i].a; if(sum==maxx) f=true; } sort(p,p+3,cmp); if(p[1].a==p[2].a&&p[1].a+min(p[0].a,p[0].b)==maxx) f=true; if(p[1].a==p[2].b&&p[1].a+min(p[0].a,p[0].b)==maxx) f=true; if(p[1].b==p[2].a&&p[1].b+min(p[0].a,p[0].b)==maxx) f=true; if(p[1].b==p[2].b&&p[1].b+min(p[0].a,p[0].b)==maxx) f=true; if(f) printf("YES\n"); else printf("NO\n"); } return 0; }