LOI 2887 [USACO07NOV]防晒霜Sunscreen

题目描述

有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉。
而刚开始的阳光的强度非常大,奶牛都承受不住,然后奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值。
那么为了不让奶牛烫伤,又不会没有效果。
给出了L种防晒霜。每种的数量和固定的阳光强度也给出来了
每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛有几个。

分析

贪心,以奶牛的最大承受量排序,一个个匹配就是最大值了。

#include 
#define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i )
#define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i )
#define erep( i , u ) for( int i = head[(u)] ; ~i ; i = e[i].nxt )
using namespace std;
int _read(){
    char ch = getchar();
    int x = 0 , f = 1 ;
    while( !isdigit( ch ) )
           if( ch == '-' ) f = -1 , ch = getchar();
           else ch = getchar();
    while( isdigit( ch ) )
           x = (ch  - '0') + x * 10 , ch =  getchar();
    return x * f;
}
const int maxn = 2500 + 5 , maxl = 1000 + 5;
struct cow{
    int l , r;
} c[maxn];
struct lotion{
    int s , n;
} l[maxn];
inline bool cmp( cow a , cow b ){
    return a.r < b.r;
}
inline bool _cmp( lotion a , lotion b ){
    return a.s < b.s;
}
int main(){
    //freopen("test.txt" , "r" , stdin);
    int C = _read() , L = _read();
    rep( i , 1 , C ) c[i].l = _read() , c[i].r = _read();
    rep( i , 1 , L ) {
        l[i].s = _read() , l[i].n = _read();    
    }
    sort( c + 1 , c + C + 1 , cmp );
    sort( l + 1 , l + L + 1 ,_cmp );
    int ans = 0;
    rep( i , 1 , C ){
        rep( j , 1 , L ){
            if( l[j].n && c[i].l <= l[j].s && l[j].s <= c[i].r ){
                l[j].n-- , ans++ ; break;
            }   
        }
    }
    cout << ans << endl;
    return 0;
}

你可能感兴趣的:(贪心)