[USACO07NOV]防晒霜Sunscreen

POJ

洛咕

题意:有N个奶牛去晒太阳 ((1<=N<=2500)),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值.所以奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值.给出了(M(1<=M<=2500))种防晒霜.每种防晒霜的固定的阳光强度和数量也给出来了,每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛有几个.

分析:贪心策略:给奶牛按照最小忍受值从大到小排序,对于每一头奶牛,选择符合该奶牛的且阳光强度最大且有剩余的防晒霜即可.

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=2505;
struct ppx{
	int l,r;
}a[N];
struct PPX{
	int x,y;
}b[N];
inline bool cmp(const ppx &x,const ppx &y){return x.l>y.l;}
inline bool CMP(const PPX &X,const PPX &Y){return X.x>Y.x;}
int main(){
	int n=read(),m=read();
	for(int i=1;i<=n;++i){
		a[i].l=read();
		a[i].r=read();
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=m;++i){
		b[i].x=read();
		b[i].y=read();
	}
	sort(b+1,b+m+1,CMP);
	int ans=0;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(b[j].x>=a[i].l&&b[j].x<=a[i].r&&b[j].y>=1){
				++ans;--b[j].y;break;
			}
	printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/PPXppx/p/11230891.html