2021-01-27

在这里插入图片描述

用结构体排序

将木棍的某一属性按照从大到小的顺序进行排列(长度优先)

需要注意的是,如果在两根木棍长度相等的情况下,必须要按宽度排序

在排序后,我们直接可以扔到这个长度不管了,直接把宽度跑一遍最长不上升子序列,得出最长不上升子序列的个数。但是我们知道,最长不上升子序列的个数等于最长上升子序列的长度,

struct Stick {
	int l, w;
}t[5050];
// 首先定义一个结构体,存放木棍的长度和宽度.
int n, dp[5050];
// 然后定义木棍的数量 n 和 dp 数组.
bool cmp(Stick, Stick);

int main() {
//	freopen("1.in", "r", stdin);
	cin >> n;
	for(int i = 1; i <= n; ++i) cin >> stick[i].l >> stick[i].w;
	sort(stick + 1, stick + 1 + n, cmp);

	dp[1] = stick[1].w;
.   int k = 1; 
	for(int i = 2, j; i <= n; ++i) j = lower_bound(dp + 1, dp + k + 1, stick[i].w) - dp, j <= k ? dp[j] = stick[i].w : dp[++k] = stick[i].w;
  
	cout << k << '\n', exit(0);
}
bool cmp(Stick a, Stick b) {//排序函数长相等就用宽排
	if(a.l != b.l) return a.l > b.l; 
	return a.w > b.w; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值