POJ3614 [USACO07NOV]防晒霜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; minSPFi ≤ maxSPFi ≤ 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
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 }