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
    ");
    		else
    			printf("NO
    ");
    	}
    	return 0;
    }

  • 原文地址:https://www.cnblogs.com/playboy307/p/5273427.html