这是一个经典的贪心+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; }