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
输入输出样例
3 2 3 10 2 5 1 5 6 2 4 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 }