• 【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;
    }
  • 相关阅读:
    mysql--------常用命令
    PHP--------微商城实现微信授权登录
    mysql--------命令来操作表
    PHP--------解决网址URL编码问题
    php-----utf8和gbk相互转换
    javascript遍历json对象数据的方法
    PHP-----------HTTP请求的第三方接口
    PHP------数组和对象相互转化,stdClass Object转array
    include与require的区别
    PHP中exit()与die()的区别
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444853.html
Copyright © 2020-2023  润新知