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 }