FatMouse’s Speed
题目要求找出体重严格递增的同时,速度严格递减的老鼠们,而且要输出尽可能长的一个例子。
题目的本质就是在对体重排升序后,求速度的最长递减序列。
I/O方面一个不一样的地方就是输入的时候没有提前告诉我们总共有多少数据。
#include<iostream>
#include<algorithm>
using namespace std;
struct mice{
int speed; //老鼠体重
int weight; //老鼠速度
int flag; //老鼠编号
int pre; //这个老鼠应该接在哪个老鼠后面,第一只老鼠为-1
int num; //以这只老鼠结尾能形成的最长序列
}chen[1010];
int ar[1010]; //用于存储要输出的序列
bool cmp(mice a,mice b)
{
return a.weight<b.weight||(a.weight==b.weight&&a.speed>b.speed);
}
int main()
{
int n,i,j,max,index;
n=0;
while(cin>>chen[n].weight>>chen[n].speed)
{
chen[n].flag = n+1;
n++;
}
sort(chen,chen+n,cmp);
for(i=0;i<=n;i++)
{
chen[i].pre = -1;
chen[i].num = 1;
}
for(i=0;i<=n;i++)
{
max = 0;
index = -1;
for(j=0;j<i;j++)
if(chen[j].weight<chen[i].weight&&
chen[j].speed>chen[i].speed&&max<chen[j].num)//找出这只鼠能合法接上的最长序列
{
max = chen[j].num;
index = j;
}
if(index!=-1)
{
chen[i].num = chen[index].num+1;
chen[i].pre = index;
}
}
max = 0;
index = 0;
for(i=0;i<n;i++)
if(max<=chen[i].num)
{
max = chen[i].num;
index = i;
}
n=0;
while(chen[index].pre!=-1)
{
ar[n] = chen[index].flag;
index = chen[index].pre;
n++;
}
ar[n] = chen[index].flag;
cout<<n+1<<endl;
for(i=n;i>=0;i--)
cout<<ar[i]<<endl;
return 0;
}