hdu 4293 Groups (2012 ACM/ICPC Asia Regional Chengdu Online)

题目可以转化为: ,每一个人的回答都可以确定他是处于队列的哪个区间, 有一个简化版的问题:在一个数轴上最多有多少个不相交的区间, 而这一题的每个区间还容纳不同的人数, 求不相连的区间的人数和最大 。

扫一遍dp就过了;

值得注意的是, 每个区间人数不能超过它的长度:


 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define M 1010
using namespace std;

struct Node
{
    int x, y;
    bool operator < ( const Node &a ) const
    {
        return y < a.y;
    }
}node[M];
int num[M][M];
int dp[M];

int main()
{
    int n, m;
    int a, b, x, y;
    while( scanf( "%d", &n ) == 1 ){
        m = 0;
        memset( num, 0, sizeof(num) );
        for( int i = 0; i < n; i++ ){
            scanf( "%d%d", &a, &b );
            if( a + b >= n )
                continue;
            
            if( num[a+1][n-b] == 0 ){
                node[m].x = a + 1;
                node[m++].y = n - b;
            }
            num[a+1][n-b]++;
            if( num[a+1][n-b] > n-a-b )
                num[a+1][n-b] = n-a-b;
        }
        sort( node, node + m );
        memset( dp, 0, sizeof(dp) );
        int j = 0;
        for( int i = node[0].y; i <= node[m-1].y; i++ ){
            dp[i] = dp[i-1];
            while( node[j].y == i ){
                if( dp[i] < dp[node[j].x-1] + num[node[j].x][node[j].y] )
                    dp[i] = dp[node[j].x-1] + num[node[j].x][node[j].y];
                j++;
            }
        }
        if( m > 0 )
            printf( "%d\n", dp[node[m-1].y] );
        else
            printf( "0\n" );
    }
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值