hdu1051

7 篇文章 0 订阅


题意:这道题本质是就是求矩形的嵌套,看一个小的矩形能否嵌套在一个大的矩形中,层层嵌套,问最后能有几个这样的矩形。

思路:贪心,首先按照长度小的放在前面,如果长度相同,就按照宽度小的在前进行排序。这样就能够保证前面的能够放在后面的里面。


#include <iostream>
#include<cstdio>
#include <cstring>
#include <algorithm>
#define N 5005
using namespace std;
struct Wooden
{
    int length,width;
    bool flag;
}w[N];
bool cmp(const Wooden w1,const Wooden w2)
{
    if(w1.length<w2.length)
        return true;
    else if(w1.length==w2.length&&w1.width<w2.width)
        return true;
    return false;
}
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d%d",&w[i].length,&w[i].width);
            w[i].flag=false;
        }
        sort(w,w+n,cmp);//排序,长度小的,宽度小的在前
        int cnt=0,num=0,flag=0;
        int length,width;
        while(num<n)//还有没有嵌套的
        {
            cnt++;//用来记录次数
            flag=0;
            for(int i=0;i<n;i++){
                if(flag==0&&!w[i].flag){//第一个没有被访问的
                    flag=1;
                    w[i].flag=true;
                    length=w[i].length;
                    width=w[i].width;
                    num++;//被访问的木头个数
                }
                else if(!w[i].flag&&w[i].length>=length&&w[i].width>=width){//后面的能够放进去的条件,长度和宽度都要大于等于前面的
                    w[i].flag=true;
                    length=w[i].length;
                    width=w[i].width;
                    num++;
                }
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值