智商欠费系列,记录路径
点击打开链接
#include <iostream>
#include <iomanip>
#include<queue>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<iomanip>
#include<string.h>
#include<sstream>
#include<string>
//定义函数段
#define repf(i,a,b) for(int i =(a);i<(b);i++)
using namespace std;
struct mouse{
public :
int num ;
int weight;
int speed ;
};
bool cmp(mouse a ,mouse b )
{
if(a.weight==b.weight)
return a.speed>b.speed;
return a.weight<b.weight;
}
struct node{
public :
int num ;//记录之前有多少个符合要求的mouse
int pre;
} dp[1000];
mouse mice[1000];
int main() {
int index = 0 ;
while(cin>>mice[index].weight&&cin>>mice[index].speed)
{
mice[index].num=index+1;
index ++ ;
}
repf(i,0,1000)
{
dp[i].num = 1;//符合上述要求的并且包括自己的这个串上有多少个老鼠
dp[i].pre = 0;
}
sort(mice,mice+index,cmp);
int Max = 0 ,beginIndex;
repf(i,0,index)
{
repf(j,0,i)
{
//判断是不是辐射最上层的要求
if(mice[j].speed>mice[i].speed&&mice[j].weight<mice[i].weight)
{
//看看长度如果小的话,那么就可以加
if(dp[i].num<dp[j].num+1)
{
//更新最长节点数
dp[i].num=dp[j].num+1;
//更新上一个老鼠的位置
dp[i].pre=j;
}
}
}
//更新最大值
if(dp[i].num>Max)
{
Max=dp[i].num;
beginIndex = i ;
}
}
//这个其实完全没必要,直接一个循环,就是结果。
int m[1000];
repf(k,0,Max)
{
m[k] = beginIndex;
beginIndex = dp[beginIndex].pre;
}
//输出个数
cout << Max<<endl;
//输出路径
for(int k = Max-1;k>=0;k--)
{
cout << mice[m[k]].num<<endl;
}
return 0;
}