洛谷P1233 木棍加工

这是一个经典的贪心+DP。
首先我们读题,可以发现一个显然的贪心结论:如果我们把最长最宽的棍子放在前面,时间用的岂不是最少?
解法就是上述的问题。直接排序(排序在长度相同的时候就用宽度),然后比较宽度,存一个最小的宽度。考虑设置一个vis数组,如果之后的棍子没被vis过而且宽度更小,我们就更新宽度顺便打上标记。做完这些之后,遍历数组,如果vis没被打上标记,说明这玩意没被前面更大的更新过,ans++即可。
Code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define maxn 100001
using namespace std;
struct Gunzi{
    int l,w;
}g[maxn];
int n,vis[maxn],li,wi,ans;
inline bool cmp(Gunzi a,Gunzi b){
    if(a.l==b.l) return a.w>b.w;
    return a.l>b.l;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        g[i].l=x;
        g[i].w=y;
    }
    sort(g+1,g+1+n,cmp);
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            wi=g[i].w;
            for(int j=i+1;j<=n;j++){
                if(g[j].w<=wi&&!vis[j]){
                    vis[j]=1;
                    wi=g[j].w;
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]) ans++;
    }
    cout<<ans;
    return 0;
}
原文地址:https://www.cnblogs.com/kenlig/p/9822592.html