【J - FatMouse's Speed】

80 篇文章 0 订阅
80 篇文章 0 订阅

思路:

  • LIS变种,输出路径,故使用三角形动归比较方便。
  • 坑不少,还是做出来了。合并成一句话:因为是倒序输出,想要先输出 w 小(v 大)的;因此要把 w 小的放后边,因此要在 sort 时把 w 小的放后边

代码:

  • 15ms 1440kB
//15ms		1440kB


#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1005;

struct NODE{
	int id;//sort之后元素在数组中的位置会发生改变,因此要记录之前的id 
	int w;
	int v;
	friend bool operator < (NODE a , NODE b)
	{
		if(a.w == b.w)
			return a.v < b.v;
		return a.w > b.w;
	}//要尽可能使元素入串,根据这一原则重载,而且要注意sort是从小到大 
}node[maxn];int cnt = 0;
int dp[maxn];
int ans = 0;
int path[maxn];//用于输出路径 

int main(){
	int l,r;
	while(cin>>l>>r){
		cnt++;
		node[cnt].id = cnt;
		node[cnt].w = l;
		node[cnt].v = r;
	}
	sort(node+1 , node+cnt+1);//要sort,因为不用按输入顺序,可以自由顺序套娃 
	memset(path , 0 , sizeof(path));
	for(int i=1;i<=cnt;i++){
		dp[i] = 1;
		for(int j=1;j<i;j++)
			if(node[i].w < node[j].w && node[i].v > node[j].v)//因为是倒序输出,想要先输出w小(v大)的;因此要把w小的放后边,因此要在sort时把w小的放后边 
				if(dp[i] < dp[j] + 1){
					dp[i] = dp[j] + 1;
					path[i] = j;
				}
		ans = max(ans , dp[i]);
	}
	cout<<ans<<endl;
	int i;
	for(i=cnt;i;i--)
		if(dp[i] == ans)
			break;
	while(i){
		cout<<node[i].id<<endl;
		i = path[i];
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值