按要求是将mice的体重m[i].we按小到大排序。
若体重相等,则按速度m[i].sp小到大排序。
用m[i].id记录mice输入的位置。
找m[i].sp的最长下降子序列。
用path[i]记录从 1 ~ i - 1 中 比m[i].sp大的最后一个的位置 ( 排序后的位置 )。
然后递归输出 。。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct MICE {
int we, sp, id;
}m[1005];
int opt[1005], i, j, path[1005];
bool cmp ( MICE a, MICE b ) {
if ( a.we == b.we ) return a.sp < b.sp;
else return a.we < b.we;
}
void out ( int ipo, int p[] ) {
if ( ipo == 0 ) return;
out ( p[ipo], p );
printf ( "%d\n", m[ipo].id );
}
int main ( ) {
int Case = 1;
while ( scanf ( "%d%d", &m[Case].we, &m[Case].sp ) != EOF )
m[Case].id = Case++;
memset ( opt, 0, sizeof ( opt ) );
memset ( path, 0, sizeof ( path ) );
sort ( m, m + Case, cmp );
m[0].sp = 10005;
for ( i = 1; i < Case; ++i )
for ( j = i - 1; j >= 0; --j )
if ( m[j].sp > m[i].sp && opt[j] + 1 > opt[i] ) {
opt[i] = opt[j] + 1;
path[i] = j;
}
int ans = 0, ii;
for ( i = 1; i < Case; ++i )
if ( opt[i] > ans ) {
ans = opt[i];
ii = i;
}
printf ( "%d\n", ans );
out ( ii, path );
}