零件分组(stick) 贪心 水

E. 零件分组(stick) [ 问题 1800 ] [ 讨论 ]
Description
某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi)。现在为了加工需要,要将它们分成若干组,使每一组的零件都能排成一个长度和重量都不下降(若i<j,则Li≤Lj,Wi≤Wj)的序列。请问至少要分成几组?

Input
第一行为一个整数N(N≤1000),表示零件的个数。第二行有N对正整数,每对正整数表示这些零件的长度和重量,长度和重量均不超过10000。

Output
仅一行,即最少分成的组数。

Samples
Input 复制
5
8 4 3 8 2 3 9 7 3 5
Output
2
思路:
首先按长度将其大致分出一组来,然后对重量进行贪心;

struct ss{
    int l,w;
}q[10001];
short judge[10001]={0};这个存的是按重量分组时当前每一组的最后一个棍子的重量,(把每组最后一个棍子的重量标为一其他的为零。
int cmp(ss a,ss b)
{
    if(a.l==b.l) return a.w<b.w;
    return a.l<b.l;
}
int main() {
    int n;
    cin>>n;
    memset(judge,0,sizeof judge);
    for(int i=1;i<=n;i++)
    {
        cin>>q[i].l>>q[i].w;
    }
    sort(q+1,q+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        for(int j=q[i].w;j>=1;j--)
        {
            if(judge[j]==1)
            {
                judge[j]=0;
                break;
            }
        }
        judge[q[i].w]=1;
    }就是从后面一个一个往前赶。
    int sum=0;
    for(int i=1;i<=10001;i++)
    {
        if(judge[i]) sum++;前面说了每组的最后一个标一就数一下有几个一就行了。
    }
    cout<<sum;
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值