P2887 [USACO07NOV]防晒霜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
思路:

区间覆盖问题,求线段最多覆盖多少点,线段按右端点排序,防晒霜按防护值排序

之后进行贪心即可,注意防晒霜的数量

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=5010;

int n,m;
int ans;

struct cow {
	int l,r;
} a[N];

struct sun {
	int n,s;
} b[N];

bool cmp1(cow x,cow y) {
	if(x.r<y.r)
		return true;
	return false;
}

bool cmp2(sun a,sun b) {
	if(a.n<b.n)
		return true;
	return false;
}

int main () {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)
		scanf("%d%d",&a[i].l,&a[i].r);
	for(int i=1; i<=m; i++)
		scanf("%d%d",&b[i].n,&b[i].s);
	sort(a+1,a+n+1,cmp1);
	sort(b+1,b+m+1,cmp2);
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++)
			if(b[j].n>=a[i].l&&b[j].n<=a[i].r&&b[j].s) {
				b[j].s--;
				ans++;
				break;
			}
	}
	printf("%d\n",ans);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/mysh/p/11291526.html