zoukankan      html  css  js  c++  java
  • UVA 1587

    在这里插入图片描述在这里插入图片描述

    题目大意:

    多组输入,每组输入6个a b 表示有a x b 大小的长方形,询问这6个能否拼成长方体。

    解题思路:

    这道题是我想多了,刚开始又想正方体。。不规则长方体。。之类的,最后发现就一正常的长方体,这道题很好理解,但是想AC需要把所有情况都考虑全。我们先输入这6个长方形,然后让a始终<=b,用pair存一下。输入完之后按照 a 升序排一下序,如果a相同则b升序,我们考虑这样一组样例(3 4)(3 4)(3 5)(3 5)(4 5)(4 5)这是能组成长方体的,然后我们考虑几个组成长方体的条件:

    3 4
    3 4
    3 5
    3 5
    4 5
    4 5

    • 每个边出现次数一定是4的倍数
    • 一定有3对彼此相等的pair
    • 第一个短边一定等于第三个的短边
    • 第一个的长边一定等于第五个的短边
    • 第三个的长边一定等于第五个的长边
      第一次遇到这种多组输入一次输多个的题…学到了这种输入方式。
      AC代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <set>
    #include <map>
    using namespace std;
    int x,y;
    typedef pair<int ,int> pii;
    int mp[15000];
    pii p[10];
    bool cmp(pii a,pii b)//定义pair的排序方式
    {
    	if(a.first==b.first)
    	  return a.second<b.second;
    	return a.first<b.first;
    }
    bool check()
    {
    	if(mp[p[1].first]%4||mp[p[1].second]%4||mp[p[6].second]%4)//先判3边是否为4的倍数
    	  return false;
    	if(p[1]!=p[2]||p[3]!=p[4]||p[5]!=p[6])//判两两相等
    	  return false;
    	if(p[1].first!=p[3].first||p[1].second!=p[6].first||p[3].second!=p[6].second)//判边边相等
    	  return false;
    	return true;
    }
    int main()
    {
    	while(true)//输入方式
    	{
    		for(int i=1;i<=6;i++)
    		{
    			if(!(cin>>x>>y)) return 0;//一直到文件结束
    			if(x>y)
    		 	swap(x,y);
    			p[i]={x,y};
    			mp[x]++;
    			mp[y]++;
    		}
    		sort(p+1,p+7,cmp);
    		cout<<(check()?"POSSIBLE":"IMPOSSIBLE")<<endl;//检查是否合格
    		memset(mp,0,sizeof mp);
    	}
    	return 0;
    }
    
  • 相关阅读:
    线段树的区间更新---A Simple Problem with Integers
    划分树---Feed the dogs
    划分树基础知识
    Treap树的基础知识
    平衡二叉树---Shaolin
    KMA & ex_KMP---Revolving Digits
    DP---Mahjong tree
    《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量
    《程序员代码面试指南》第一章 栈和队列 求最大子矩阵大小
    《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294229.html
Copyright © 2011-2022 走看看