【洛谷习题】木棍加工

题目链接:https://www.luogu.org/problemnew/show/P1233


 

一开始的思路就是生模拟,但是感觉太奇怪了,就放弃了。

然后尝试排序,结果优先级选的是可以直接接在当前木棍后的木棍数,只对了样例。。。

看看题解,原来还可以这样玩!先只按一个属性排序,再直接找另一个属性。

具体来说,找另一个属性,就是看看最少能构成多少个最长不上升子序列,也就是其最长上升子序列的长度(根据dilworth定理)。

懒得写O(nlogn)的了,因为用的结构体,还要自己写个二分查找。

 1 #include <cstdio>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 const int maxn = 5005;
 7 
 8 struct Stick {
 9     int l, w;
10     bool operator < (const Stick& rhs) const {
11         return l > rhs.l;
12     }
13 } stick[maxn];
14 
15 int dp[maxn];
16 
17 int main() {
18     int n, ans = 1;
19     scanf("%d", &n);
20     for (int i = 1; i <= n; ++i)
21         scanf("%d%d", &stick[i].l, &stick[i].w);
22     sort(stick + 1, stick + n + 1);
23     for (int i = 1; i <= n; ++i) {
24         dp[i] = 1;
25         for (int j = 1; j < i; ++j)
26             if (stick[i].w > stick[j].w) {
27                 dp[i] = max(dp[i], dp[j] + 1);
28                 ans = max(ans, dp[i]);
29             }
30     }
31     printf("%d", ans);
32     return 0;
33 }
AC代码

 

转载于:https://www.cnblogs.com/Mr94Kevin/p/9800200.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值