分析
首先这儿有一道思想比较类似的题
P1250 种树
都是比较简单的贪心
但具体的情况是不一样的
我们发现,对于这个用户,所有可以覆盖他的段为
那么我们按照为双关键字排序之后
贪心得选取第一个可以继续放的区间
一定是不会使结果劣
时间复杂度:
代码
//
#include <algorithm>
#include <queue>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(int i=A;i<=B;i++)
#define BOR(i,A,B) for(int i=A;i>=B;i--)
#define Lowbit(X) (X & (-X))
#define Skip cout<<endl;
#define INF 0x3f3f3f3f
#define Rson (X<<1|1)
#define Lson (X<<1)
using namespace std;
const int MaxN=1e4+10;
struct Node {
int From,To,Limit;
}Line[MaxN];
inline bool Comp_one(Node A,Node B) { if(A.From!=B.From) return A.From<B.From; else return A.To<B.To; }
struct Comp_two {
bool operator () (Node A,Node B)const
{ return A.To>B.To; }
};
// inline bool Comp_two(Node A,Node B) { return A.To>B.To; }
int Total,Test;
priority_queue<Node,vector<Node>,Comp_two>Temp;
inline void File() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
int main() {
// File();
// ios::sync_with_stdio(false);
while(scanf("%d %d",&Total,&Test)!=EOF) {
FOR(i,1,Test) scanf("%d %d %d",&Line[i].From,&Line[i].To,&Line[i].Limit);
while(!Temp.empty()) Temp.pop();
sort(Line+1,Line+Test+1,Comp_one);
// FOR(i,1,Test) { cout<<Line[i].From<<" "<<Line[i].To<<" "<<Line[i].Limit<<endl; }
int Loc=1,Ans=0;
FOR(i,1,Total) {
while(!Temp.empty() && Temp.top().To<i) { Temp.pop(); }
while(Loc<=Test && Line[Loc].From==i) { Temp.push(Line[Loc++]); }
if(!Temp.empty()) {
Node New=Temp.top();
Temp.pop();
Ans++; New.Limit--;
if(New.Limit) Temp.push(New);
}
}
printf("%d\n",Ans);
}
// fclose(stdin);
// fclose(stdout);
system("pause");
return 0;
} 
京公网安备 11010502036488号