P1233 木棍加工

  我是想写写dp来着……所以我查了标签是dp的题。

  在做了三道蓝题之后,蒟蒻的我想做一道简单点的题恢复自信qwq……

  于是,这道题,我怎么也下过不出转移方程……但是我忽然发现,这道题根本就不用dp!贪心 + 排序即可!

  因为我们一定是要时间  < n 的,所以我们就算最后什么也没找到,也不会比 n 更差,那么我们先按照其中一个值排序,如果想要有比n更好的解,就一定要按照这个顺序去找!

  那么就等价于,我们就可以只看其中一个值就行!

  owo

  于是这道题就变成了排序,我们想要最少的下降序列,那么就是求最长的上升(严格上升)序列!

  不懂题解里的大神都是怎么想的qwq……

  下面贴代码;

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 5500
struct node
{
    int l,r;
} a[maxn];
int n;
bool cmp(node x,node y)
{
    return x.l>y.l;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d%d",&a[i].l,&a[i].r);
    sort(a+1,a+n+1,cmp);
    int cnt=0;
    int b[maxn],c[maxn];
    for(int i=1;i<=n;i++)
    b[i]=a[i].r;
    int len=1;
    c[1]=b[1];
    for(int i=2;i<=n;i++)
    {
        if(b[i]>c[len])
        {
            c[++len]=b[i];
            continue;
        }
        int p=lower_bound(c+1,c+1+len,b[i])-c;
        c[p]=b[i];
    }
    printf("%d",len);
    return 0;
}

 

posted @ 2019-01-30 16:04  paopo  阅读(112)  评论(0编辑  收藏  举报