标签:des style blog io ar os sp java for
7
题目大意:胖老鼠以为越胖的老鼠跑的越快。现在给你一些老鼠的重量和速度,
直到输入到文件结束,问:你能否找到一系列数据,来证明越胖的老鼠跑调越慢
最后输出满足条件的数据个数,并按顺序输出每组数据原本所在的行数。
思路:先用结构体存起来每只老鼠的体重、速度和所在行号。然后对结构体排序。
先按体重递增排序,再按速度递减排序。之后按最长递减序列的求法求出符合的
数据最大个数。用x[]数组存嘴上递减子序列的长度,用y[]记录排序后的最长递减
子序列倒数第二个的下标。这样能够通过往前递推的方法依次找到最长递减子序
列的路径。用z[]数组记录路径,并输出。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int a;
int b;
int i;
}num[1010];
int x[1010],y[1010],z[1010];
bool cmp(node x,node y)
{
if(x.a==y.a)
return x.b > y.b;
return x.a < y.a;
}
int main()
{
int M,N;
int i = 1;
memset(num,0,sizeof(num));
while(~scanf("%d%d",&M,&N))
{
num[i].i = i;
num[i].a = M;
num[i++].b = N;
}
sort(num+1,num+i,cmp);
int Max = 0,pos = -1;
for(int j = 1; j < i; j++)
{
x[j] = 1;
y[j] = -1;
}
for(int j = 2; j < i; j++)
{
for(int k = 1; k < j; k++)
{
if(num[k].a < num[j].a && num[k].b > num[j].b && x[k]+1>x[j])//满足体重增,速度减
{
x[j] = x[k]+1;
y[j] = k;//记录排序后的最长子序列倒数第二个的下标
}
}
if(x[j] > Max)//最长子序列的长度和最后一位的下标
{
Max = x[j];
pos = j;
}
}
int count = 0;
while(pos != -1)//得到
{
z[count++] = pos;
pos = y[pos];
}
printf("%d\n",Max);
for(int i = count-1; i>=0; i--)
printf("%d\n",num[z[i]].i);
return 0;
}
HDU1160_FatMouse's Speed【LIS变形】
标签:des style blog io ar os sp java for
原文地址:http://blog.csdn.net/lianai911/article/details/41494037