您的位置:首页 > 其它

UVA 10131-Is Bigger Smarter?

2011-12-05 18:28 369 查看
这道题要求我们找到一个满足体重是升序,智商是降序的最长的序列。首先将大象的体重做升序排序,

这样我们就只要找到排序后的序列的关于智商的最长下降子序列。为了方便操作,定义一个结构体,

包含 体重、 智商、 编号。还有定义一个数组来模拟链表,数组存的是点的父节点,然后用输出路径

的函数将路径输出。这道题输入比较奇葩,而且我们检查是否正确也会比较麻烦。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXD 1005
typedef struct aa
{
int w;
int s;
int r;
}E;

E e[MAXD];
int N, d[MAXD], p[MAXD], len, first;

int cmp( const void *_p, const void *_q)
{
E *p = (E *)_p;
E *q = (E *)_q;
return p->w - q->w;
}

void dp()
{
for( int i = 0; i < N; i ++)
d[i] = 1;
memset( p, -1, sizeof p);
qsort( e, N, sizeof e[0], cmp);
for( int i = 1; i < N; i ++)
for( int j = 0; j < i; j ++)
{
if( e[i].w == e[j].w) break;
if( e[i].s < e[j].s && d[i] < d[j] + 1)
{
d[i] = d[j] + 1;
p[i] = j;
}
}
len = 0;
for( int i = 0; i < N; i ++)
if( len < d[i])
{
len = d[i];
first = i;
}
}

void printpath( int i)
{
if( p[i] != -1)
printpath( p[i]);
printf("%d\n", e[i].r);
}

void print()
{
printf( "%d\n", len);
printpath( first);
}

int main()
{
/*
N = 9;
for( int i = 0; i < N; i ++)
{
scanf( "%d%d", &e[i].w, &e[i].s);
e[i].r = i + 1;
}
*/
N = 0;
while( scanf( "%d%d", &e
.w, &e
.s) == 2)
{
e
.r = N + 1;
N ++;
}
dp();
print();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: