1 条题解

  • 0
    @ 2025-8-24 22:25:25

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Avocadooo
    ZEST FOR LIFE

    搬运于2025-08-24 22:25:25,当前版本为作者最后更新于2021-09-28 19:09:17,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    正经教学

    1.题目类型判断

    给定一个长方体长宽高。

    又给出一个平面。

    问能否在平面上裁出该长方体展开图。(亲测,这道题是不需要考虑斜着的情况的 ,真是良心好题

    很明显,这是一道平面几何类型的题目。

    2.基本思路

    既然已经判断出了题目类型,那么这道题的方法就很简单了——画图,分析。

    情况1:1-4-1型

    如图,看是否满足 2×a+2×bx 2 \times a+2 \times b \leq x 2×b+cy 2 \times b+c \leq y 即可。

    情况2:3-3型

    如图,看是否满足 3×c+a+bx 3 \times c+a+b \leq x a+by a+b \leq y 即可。

    情况3:2-2-2型

    如图,看是否满足 2×a+b+cx 2 \times a+b+c \leq x a+b+cy a+b+c \leq y 即可。

    以上呢,就是总结出的三种长方体的展开图,我们也可以通过交换 a,b,c a,b,c 的值来放置,同样可以将纸张旋转(即交换 x,y x,y 的值)。那么我们只需要将 a,b,c a,b,c 存入一个数组,用系统函数帮我们进行全排列,就可以得出正确的答案了。

    3.std代码

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    int a[4];
    int x,y;
    bool test()
    {
    	for(int i=1;i<=6;i++)
    	{
    		for(int i=1;i<=2;i++)
    		{ 
    			if(2*a[1]+2*a[2]<=x&&2*a[2]+a[3]<=y) return true;//情况1
    			if(3*a[3]+a[1]+a[2]<=x&&a[1]+a[2]<=y) return true;//情况2
    			if(2*a[1]+a[2]+a[3]<=x&&a[1]+a[2]+a[3]<=y) return true;//情况3
    			swap(x,y);//旋转纸张 
    		}
    		next_permutation(a+1,a+4);
    	}
    	return false;
    }
    int main()
    {
    	scanf("%d %d %d",&a[1],&a[2],&a[3]);
    	scanf("%d %d",&x,&y);
    	bool flag=test();
    	if(flag) printf("Yes");
    	else printf("No");
    }
    
    • 1

    信息

    ID
    6112
    时间
    3000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者