zoukankan      html  css  js  c++  java
  • 【POJ3614】Sunscreen

    problem

    有C个奶牛去晒太阳,第i头奶牛需要minSPF[i]和maxSPF[i]单位强度之间的阳光。每头奶牛晒太阳之前要涂防晒霜,防晒霜有L种,涂上第i种以后阳光强度就会稳定为SPF[i],第i种防晒霜有cover[i]瓶。求最多可以满足多少头奶牛晒太阳。(1 <=C,L<= 2500)

    solution

    按照minSPF递减的顺序把奶牛排序,依次考虑每头奶牛。
    对于每头奶牛,扫描所有能用的防晒霜,找一个最大的用了。

    贪心,可用范围缩放证明。
    考虑当前奶牛用了防晒霜后的范围拓展到后来的奶牛。
    对于两头奶牛x,y,一瓶防晒霜会出现1.x,y都可以用,2.x可以用,y不能用,3.x,y都不能用三种情况,因为已经按照minSPF[i]降序排序了,所以越小的防晒霜,后面的奶牛才有越大的可能会用到。

    好激动,第一次自己写没看题解而且一遍就过了。。。

    codes

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn = 2520;
    int C, minSPF[maxn], maxSPF[maxn], r1[maxn];
    int L, SPF[maxn], cover[maxn], r2[maxn];
    bool cmp1(int a, int b){return minSPF[a]>minSPF[b];}
    bool cmp2(int a, int b){return SPF[a]>SPF[b];}
    int main(){
        //input
        cin>>C>>L;
        for(int i = 1; i <= C; i++)
            cin>>minSPF[i]>>maxSPF[i];
        for(int i = 1; i <= L; i++)
            cin>>SPF[i]>>cover[i];
        //sort
        for(int i = 1; i <= C; i++)r1[i] = i;
        sort(r1+1,r1+C+1,cmp1);
        for(int i = 1; i <= L; i++)r2[i] = i;
        sort(r2+1,r2+L+1,cmp2);
        //do
        int ans = 0;
        for(int i = 1; i <= C; i++){
            for(int j = 1; j <= L; j++){
                if(cover[r2[j]] && minSPF[r1[i]]<=SPF[r2[j]] && SPF[r2[j]]<=maxSPF[r1[i]]){
                    ans++;  cover[r2[j]]--;
                    break;
                }
            }
        }
        cout<<ans<<'
    ';
        return 0;
    }
  • 相关阅读:
    MongoDB 安装及其配置
    hdu 1241 Oil Deposits
    2014ACM/ICPC亚洲区北京站
    hdu 5901 count prime & code vs 3223 素数密度
    hdu 2191 珍惜现在,感恩生活
    FOJ 2181 快来买肉松饼
    hdu 5384 Danganronpa
    hdu 2222 Keywords Search
    hdu 1300 Pearls
    2016.2.24. 《构建之法》开始阅读
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444853.html
Copyright © 2011-2022 走看看