1707: [Usaco2007 Nov]tanning分配防晒霜

Description

奶牛们计划着去海滩上享受日光浴。为了避免皮肤被阳光灼伤,所有C(1 <= C <= 2500)头奶牛必须在出门之前在身上抹防晒霜。第i头奶牛适合的最小和最 大的SPF值分别为minSPF_i和maxSPF_i(1 <= minSPF_i <= 1,000; minSPF_i <= maxSPF_i <= 1,000)。如果某头奶牛涂的防晒霜的SPF值过小,那么阳光仍然能 把她的皮肤灼伤;如果防晒霜的SPF值过大,则会使日光浴与躺在屋里睡觉变得 几乎没有差别。为此,奶牛们准备了一大篮子防晒霜,一共L(1 <= L <= 2500)瓶。第i瓶 防晒霜的SPF值为SPF_i(1 <= SPF_i <= 1,000)。瓶子的大小也不一定相同,第i 瓶防晒霜可供cover_i头奶牛使用。当然,每头奶牛只能涂某一个瓶子里的防晒霜 ,而不能把若干个瓶里的混合着用。 请你计算一下,如果使用奶牛们准备的防晒霜,最多有多少奶牛能在不被灼 伤的前提下,享受到日光浴的效果?

Input

* 第1行: 2个用空格隔开的整数:C和L

* 第2..C+1行: 第i+1行给出了适合第i头奶牛的SPF值的范围:minSPF_i以及 maxSPF_i * 第C+2..C+L+1行: 第i+C+1行为了第i瓶防晒霜的参数:SPF_i和cover_i,两个 数间用空格隔开。

Output

* 第1行: 输出1个整数,表示最多有多少头奶牛能享受到日光浴

Sample Input

3 2
3 10
2 5
1 5
6 2
4 1

输入说明:

一共有3头奶牛,2瓶防晒霜。3头奶牛适应的SPF值分别为3..10,2..5,以
及1..5。2瓶防晒霜的SPF值分别为6(可使用2次)和4(可使用1次)。可能的分
配方案为:奶牛1使用第1瓶防晒霜,奶牛2或奶牛3使用第2瓶防晒霜。显然,最
多只有2头奶牛的需求能被满足。

Sample Output

2

HINT

 

Source

 
用了n^3的暴力。。居然没有T。。难道说这个时间复杂度是玄学吗?(大雾。。。
应该是防晒霜覆盖的值比较小。。。
 
说做法,贪心。。。
如果有一头牛同时满足两瓶防晒霜,那么这头牛用值更小的那瓶更优;
如果有两头牛同时满足一瓶防晒霜,那么满足上限更小的牛一定更优;
然后就可以贪心了。。
 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<algorithm>
 7 #include<string>
 8 #include<map>
 9 #include<queue>
10 #include<vector>
11 #include<set>
12 #define inf 1000000000
13 #define maxn 10000+5
14 #define maxm 10000+5
15 #define eps 1e-10
16 #define ll long long
17 #define for0(i,n) for(int i=0;i<=(n);i++)
18 #define for1(i,n) for(int i=1;i<=(n);i++)
19 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
20 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
22 using namespace std;
23 int read(){
24     int x=0,f=1;char ch=getchar();
25     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
26     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
27     return x*f;
28 }
29 struct cow{
30     int mis,mxs;
31 }e[maxn];
32 struct spf{
33     int sp,cov;
34 }w[maxn];
35 bool cmp(spf a,spf b){
36     return a.sp<b.sp;
37 }
38 bool used[maxn];
39 int main(){
40     //freopen("input.txt","r",stdin);
41     //freopen("output.txt","w",stdout);
42     int n=read(),m=read();
43     for1(i,n)    e[i].mis=read(),e[i].mxs=read();
44     for1(i,m)    w[i].sp=read(),w[i].cov=read();
45     sort(1+w,1+m+w,cmp);
46     int ans=0;
47     for1(i,m){
48         for1(j,w[i].cov){
49             int tmp=0,mn=inf;
50             for1(k,n){
51                 if(used[k]||e[k].mis>w[i].sp||e[k].mxs<w[i].sp)continue;
52                 if(e[k].mxs<mn){
53                     mn=e[k].mxs;
54                     tmp=k;
55                 }
56             }
57             if(tmp){
58                 used[tmp]=1;
59                 ans++;
60             }
61         }
62     }
63     printf("%d",ans);
64     return 0;
65 }
View Code

 

 
posted @ 2016-03-19 16:17  HTWX  阅读(164)  评论(0编辑  收藏  举报