UVa 10131 - Is Bigger Smarter?

次题是将elephant的体重按升续排列,然后求IQ的最长下降子序列。次题的难点在于如何记录id,并且输出。。。


// File Name: UVa10131.cpp
// Author: Toy
// Created Time: 2013年04月08日 星期一 11时30分15秒

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cctype>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <iomanip>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <utility>
#include <bitset>
#define L(x) x << 1
#define R(x) x << 1 | 1

using namespace std;
struct Ele {
    int we, iq, id;
}ele[1005];

bool cmp ( Ele a, Ele b ) {
    if ( a.we == b.we ) return a.iq < b.iq;
    else return a.we < b.we;
}

void output ( int p[], int ipo ) {
    if ( ipo == 0 ) return;
    output ( p, p[ipo] );
    printf ( "%d\n", ele[ipo].id );
}

int opt[1005], path[1005];

int main ( ) {
    int tmp = 1;
    while ( scanf ( "%d%d", &ele[tmp].we, &ele[tmp].iq ) != EOF ) 
	ele[tmp].id = tmp++;

    memset ( path, 0 ,sizeof ( path ) );
    memset ( opt, 0, sizeof ( opt ) );

    sort ( ele + 1, ele + tmp, cmp ); 
    //for ( int i = 1; i < tmp; ++i ) 
	//printf ( "%d %d\n", ele[i].we, ele[i].iq );
    
    ele[0].iq = 10000;
    for ( int i = 1; i < tmp; ++i ) 
	for ( int j = i - 1; j >= 0; --j ) 
	    if ( ele[j].iq > ele[i].iq && opt[j] + 1 > opt[i] ) opt[i] = opt[j] + 1, path[i] = j;

    int ii, ans = 0;
    for ( int i = 1; i < tmp; ++i ) 
	if ( opt[i] > ans ) ans = opt[i], ii = i;
    printf ( "%d\n", ans );

    output ( path, ii );

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值