题意:
有若干只老鼠,给出每只老鼠的大小和速度。输出尽量多的老鼠的下标m1,m2,m3……满足下标对应的老鼠大小严格递增而老鼠速度严格递减。

思路:先对老鼠的速度从大到小排序,在对老鼠的大小求最长上升子序列。在这过程中,用pre[ ]记录路径。

注意:答案与示例不一致,题目要求是只要输出一种即可,不需要和题目中的一定相同
code

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<iostream>
#include<set>
#include<iomanip>
using namespace std;
int n,m,r,k;
int mmax;
int a[111111];
int tu[1130][1120];

//int num
int tx[]={0,1,0,-1};
int ty[]={1,0,-1,0};
struct node
{
    int speed,weight,id;
    bool operator<(const node&t)
    {
        if(speed==t.speed)
            return weight<t.weight;
        else
            return speed>t.speed;

    }
}data[9999];
int dp[1200],pre[1200];
int cnt,s,w,mm,mmid;
void solve()
{
    memset(pre,-1,sizeof(pre));
    for(int i=1;i<=cnt;i++)
    {
        dp[i] = 1;
        for(int j=1;j<i;j++)
        {
            if(data[j].weight<data[i].weight&&dp[i]<dp[j]+1)
            {
                dp[i] = dp[j]+1;
                pre[data[i].id] = data[j].id;
               // mmid = data[i].id;
            }
        }
        if(mm<dp[i])
        {
            mm = dp[i];
            mmid = data[i].id;
        }
    }
    int top = 0;
    cout<<mm<<endl;
    int temp[1000];
    for(int i=mmid;i!=-1;i=pre[i])
    {
        temp[++top] = i;
    }
    for(int i=top;i>=1;i--)
    {
        printf("%d\n",temp[i]);
    }
}
int main()
{
     cnt = 0;
     while(cin>>w>>s)
     {
         node t;
         t.speed = s;
         t.weight = w;
         t.id = cnt+1;
         data[++cnt] = t;
     }
      mm = 0;
         sort(data+1,data+1+cnt);
         solve();
     return 0;
}