此题要求老鼠体重递增,速度递减的最长序列。
先按照老鼠速度递减排序,如果速度相同按体重递增排序。
这样速度已经满足要求,再在体重中找最长递增序列,便是题目要求的最长序列。
nlogn+记录路径:路径不唯一
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct node
{
int weight,speed,trace;
}MOUSE;
MOUSE mice[1001];
int cmp(const MOUSE &a,const MOUSE &b)
{
if(a.speed!=b.speed)
return a.speed>b.speed;
else
return a.weight<b.weight;
}
int Binsearch(int key,int* dp,int left,int right)
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(dp[mid]<key)
{
if(dp[mid+1]>key) return mid;
else left=mid+1;
}
else right=mid-1;
}
return 0;
}
int main()
{
int a,b,dp[1001],f[1001],path[1001];
int i,j,k,n,t,len;
i=0;
while(scanf("%d%d",&a,&b)!=EOF)
{
mice[i].weight=a;
mice[i].speed=b;
mice[i].trace=i;
i++;
}
n=i;
sort(mice,mice+n,cmp);
/*for(i=0;i<n;i++)
{
printf("%d %d %d\n",mice[i].weight,mice[i].speed,(mice[i].trace+1));
}*/
len=1;
k=0;
dp[len]=mice[0].weight;
f[k]=1;
k++;
for(i=1;i<n;i++)
{
if(mice[i].weight>dp[len])
{
len++;
j=len;
}
else
{
j=Binsearch(mice[i].weight,dp,1,len);
j++;
}
dp[j]=mice[i].weight;
f[k]=j;
k++;
}
printf("%d\n",len);
t=len;
for(i=n-1;i>=0;i--)
{
if(f[i]==t)
{
t--;
path[t]=mice[i].trace;
}
if(t<0) break;
}
for(i=0;i<len;i++)
printf("%d\n",path[i]+1);
return 0;
}