USACO 2007 NOV Sunscreen 防晒霜 贪心

题目

题目描述

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?

有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉。

而刚开始的阳光的强度非常大,奶牛都承受不住,然后奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值。

那么为了不让奶牛烫伤,又不会没有效果。

给出了L种防晒霜。每种的数量和固定的阳光强度也给出来了

每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛有几个。

输入输出格式

输入格式:

* 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

输出格式:

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

输入输出样例

输入样例#1: 复制
3 2
3 10
2 5
1 5
6 2
4 1
输出样例#1: 复制
2

分析

中文翻译有点误导,自己看清楚了,防晒霜是先读防晒指数,再读防晒霜的个数。奶牛按上限排序,而防晒霜直接按防晒值排序就可以了。

我对于这种排序方式的理解是:我们使得防晒值与奶牛上限越接近,意味着后面的防晒霜越难来满足这只奶牛,也就是这瓶防晒霜来满足这只奶牛是更优的。一瓶防晒霜最多只能满足一只奶牛,所以如果能满足,那么就用这瓶防晒霜。这就是这道题一个贪心的想法。

程序

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXC = 2500 + 1;
 4 struct node
 5 {
 6     int Mn, Mx;
 7 }cows[MAXC];
 8 struct sunscreen
 9 {
10     int amt, cov;
11 }ss[MAXC];
12 bool comp1(node x, node y)
13 {
14     return x.Mx < y.Mx;
15 }
16 bool comp2(sunscreen x, sunscreen y)
17 {
18     return x.cov < y.cov;
19 }
20 int main()
21 {
22     int c,l,ans;
23     cin >> c >> l;
24     for (int i = 1; i <= c; i++)
25         cin >> cows[i].Mn >> cows[i].Mx;
26     for (int i = 1; i <= l; i++)
27         cin >> ss[i].cov >> ss[i].amt;
28     sort(cows+1, cows+(c+1),comp1);
29     sort(ss+1, ss+(l+1), comp2);
30     for (int i = 1; i <= c; i++)
31     {
32         for (int j = 1; j <= l; j++)
33             if(ss[j].cov >= cows[i].Mn && ss[j].cov <= cows[i].Mx && ss[j].amt)
34             {
35                 ss[j].amt--;
36                 ans++;
37                 break;
38             }
39     }
40     cout << ans << endl;
41     return 0;
42 }

 

posted @ 2018-03-04 12:54  OptimusPrime_L  阅读(227)  评论(0编辑  收藏  举报