fj在圣诞节来临之际,决定给他的奶牛发一些小红花。
现在Fj一共有N头奶牛,这N头牛按照编号1..N,排成一队,来接受Fj颁发的小红花,每头奶牛最多只能戴一朵小红花,当然,不可能每头牛都能带上小红花。
于是,奶牛们就开始提要求:在编号为第s头的奶牛到编号为第e头的奶牛之间,最少要分配X朵小红花,这些要求Fj当然必须要满足,现在Fj想知道,在满足要求的情况下,最少要购买多少朵小红花。

 

INPUT:

第一行两个整数:N和M。表示有N头牛,M个要求。
接下来M行,每行3个整数,si,ei,Xi。表示一个要求,在第si到ei之间,至少要有Xi头牛获得小红花。0<si≤ei≤30000。Xi<=ei-si+1。

9
4
1 4 2
4 6 2
8 9 2
3 5 2

 

OUTPUT:

一个整数,Fj最少要买的小红花的个数。

5

 

思路:

依然的一道贪心。

策略如下:

以区间的右端点排序,左端点为次要关键字(升序);

bool mys(node a,node b)
{
    return (a.r==b.r) ? (a.l<b.l) : (a.r<b.r);
}

然后从右端点开始放,直到放完。

 

cpp:

 

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<iomanip>
 8 #include<queue>
 9 #include<vector>
10 #include<cstring>
11 using namespace std;
12 const int maxn=500001;
13 int n,m;
14 int flag[maxn],ans=0;
15 struct node
16 {
17     int l,r,v;
18 }e[maxn];
19 
20 bool mys(node a,node b)
21 {
22     return (a.r==b.r) ? (a.l<b.l) : (a.r<b.r);
23 }
24 
25 int main()
26 {
27     /*freopen("2.in","r",stdin);
28     freopen("2.out","w",stdout);*/
29     //ios::sync_with_stdio(false);
30     cin>>n>>m;
31     memset(flag,0,sizeof(flag));
32     for(int i=1;i<=m;i++)
33         cin>>e[i].l>>e[i].r>>e[i].v;
34     sort(e+1,e+1+m,mys);
35     for(int i=1;i<=n;i++)
36     {
37         int hua=e[i].v;
38         int tmp=e[i].r;
39         for(int j=e[i].l;j<=e[i].r;j++)
40             if(flag[j])    hua--;
41         for(;hua>0;tmp--)
42         {
43             if(!flag[tmp])
44             {
45                 flag[tmp]=1;
46                 ans++;
47                 hua--;
48             }
49         }
50     }
51     cout<<ans<<endl;
52     return 0;
53 }
View Code