POJ3614 [USACO07NOV]防晒霜Sunscreen

Sunscreen
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9333   Accepted: 3264

Description

To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they're at the beach. Cow i has a minimum and maximum SPF rating (1 ≤ minSPFi ≤ 1,000; minSPFimaxSPFi ≤ 1,000) that will work. If the SPF rating is too low, the cow suffers sunburn; if the SPF rating is too high, the cow doesn't tan at all........

The cows have a picnic basket with L (1 ≤ L ≤ 2500) bottles of sunscreen lotion, each bottle i with an SPF rating SPFi (1 ≤ SPFi ≤ 1,000). Lotion bottle i can cover coveri cows with lotion. A cow may lotion from only one bottle.

What is the maximum number of cows that can protect themselves while tanning given the available lotions?

Input

* Line 1: Two space-separated integers: C and L
* Lines 2..C+1: Line i describes cow i's lotion requires with two integers: minSPFi and maxSPFi
* Lines C+2..C+L+1: Line i+C+1 describes a sunscreen lotion bottle i with space-separated integers: SPFi and coveri

Output

A single line with an integer that is the maximum number of cows that can be protected while tanning

Sample Input

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

Sample Output

2

Source

 
【题解】
把min从大到小排序,然后对于每个区间,放最大的SPF。分情况讨论两个区间的先后位置可得证,证明显然。
还可用二分图最大匹配做。
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <string>
 5 #include <algorithm>
 6 
 7 const int INF = 0x7fffffff;
 8 const int MAXN = 2500 + 10; 
 9 
10 inline void read(int &x)
11 {
12     x = 0;char ch = getchar(),c = ch;
13     while(ch < '0' || ch > '9')c = ch, ch = getchar();
14     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
15     if(c == '-')x = -x;
16 }
17 
18 int l[MAXN], r[MAXN], cnt[MAXN], point[MAXN], num[MAXN], cntt[MAXN], C, L, ans;
19 
20 bool cmp(int a, int b)
21 {
22     return l[a] > l[b];
23 }
24 
25 bool cmpp(int a, int b)
26 {
27     return point[a] > point[b];
28 }
29 
30 int main()
31 {
32     //freopen("data.txt", "r", stdin);
33     read(C),read(L);
34     for(register int i = 1;i <= C;++ i) read(l[i]), read(r[i]), cnt[i] = i;
35     for(register int i = 1;i <= L;++ i) read(point[i]), read(num[i]), cntt[i] = i;
36     std::sort(cnt + 1, cnt + 1 + C, cmp);
37     std::sort(cntt + 1, cntt + 1 + L, cmpp);
38     for(register int i = 1;i <= C;++ i)
39     {
40         for(register int j = 1;j <= L;++ j)
41             if(num[cntt[j]] > 0 && r[cnt[i]] >= point[cntt[j]] && l[cnt[i]] <= point[cntt[j]])
42             {
43                 --num[cntt[j]], ++ ans;
44                 break;
45             }
46             else if(l[cnt[i]] > point[cntt[j]] ) break;
47     }
48     printf("%d", ans);
49     return 0;
50 }
POJ3614

 

posted @ 2017-08-09 10:01  嘒彼小星  阅读(432)  评论(0编辑  收藏  举报