贪心还是得保证正确再写,不难就挺难受的,这个题的贪心解法讲出来挺容易的,就是按r排序从小到大排,然后分配区间[L,R].这里也从小到大分配,能分配就分配,这样就必定是最优解了.因为我从小到大分配的R,这样的R去分配L,是不影响后面的.但是这样做的复杂度是O(N^2)的.显然太高了.我们不妨用优先队列来优化,优先队列开两维,一维是区间r,二维是权值val.我们从小到大扫描每个位子,看它是不是可以被我优先队列的元素覆盖,当然假如可以被覆盖那我就先用R区间较小的就好了.
ac代码如下:
//不要乱贪心...
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct vv{
int l,r,v;
}a[N];
bool cmp(vv x,vv y)
{
if(x.l==y.l&&x.r==y.r) return x.v<y.v;
else if(x.l==y.l) return x.r<y.r;
else return x.l<y.l;
}
int n,m;
struct av{
int R,V;
friend bool operator<(struct av x,struct av y)
{
if(x.R==y.R) return x.V>y.V;
else return x.R>y.R;
}
};
int main()
{
while(cin>>n>>m)
{
priority_queue<av>q;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
}sort(a+1,a+1+m,cmp);
int id=1,ans=0;
for(int i=1;i<=n;i++)
{
while(a[id].l==i) { q.push({a[id].r,a[id].v}),id++; }
while(q.size()&&(q.top().R<i||q.top().V==0)) { q.pop(); }
if(!q.size()) continue;
auto t=q.top();
q.pop();t.V--;
q.push(t);
ans++;
}
printf("%d\n",ans);
}
return 0;
}

京公网安备 11010502036488号