zoukankan      html  css  js  c++  java
  • Sunscreen [POJ3614] [贪心]

    描述

    C (1 ≤ C ≤ 2500) 头奶牛在海滩边晒太阳,要避免在日光浴时产生难看的灼伤,每头奶牛必须用防晒霜覆盖它的皮肤。第 i 头奶牛有一个最小和最大 SPF 值 (1 ≤ minSPFi ≤ 1,000; minSPFimaxSPFi ≤ 1,000) 将会起作用。如果 SPF 值太低,则奶牛会受到日光灼伤;如果 SPF 值太高,则牛奶无法进行日光浴。

    奶牛们有一个野餐篮子,带了 L (1 ≤ L ≤ 2500) 瓶防晒霜乳液,第 i 瓶的 SPF 值是 SPFi (1 ≤ SPFi ≤ 1,000) 。第 i 瓶防晒霜可以涂抹覆盖 coveri 头奶牛。一头牛奶只能用一瓶防晒霜涂抹。

    对于给定的防晒霜乳液,最多可以有多少头奶牛能够在日光浴时避免被灼伤?

    输入

    * 第 1 行: 两个以空格分隔的整数: CL
    * 第 2 到 C+1 行: 第 i 行描述了第 i 头奶牛的防晒霜约束条件,包括两个整数: minSPFimaxSPFi
    * 第 C+2 到 C+L+1 行: 第 i+C+1 行描述了第 i 个防晒霜瓶,包括以空格分隔的整数: SPFicoveri

    输出

    只包含一个整数的单行,表示日光浴时受到防晒保护的奶牛的最大数量。

    示例输入
    3 2
    3 10
    2 5
    1 5
    6 2
    4 1
    示例输出
       2
    分析
    这个就是点能覆盖最多区间个数的问题
    我们按右端点排好序,然后从左边开始选有没有点能覆盖当前区间的点去覆盖
    为什么这样做?
    因为后面的区间有两种可能
    1.后面区间左端点在当前区间左端点前面,这个没有影响
    2.后面区间左端点在当前区间左端点后面,这时你就明白为什么要从左边开始选了。因为后面区间的左端点更靠后,有可能前边一个区间能选到的点,后面那个区间够不着,而当前又把靠后的点选了,万一后面的区间只有那个靠后的点可选,那它就无点可选了,此时显然当前区间选更考前的点会更优
    所以,题目讲完了
    代码
     1 #include<queue>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #define maxn 2505
     7 #define inf (1<<30)
     8 #define RG register int
     9 #define rep(i,a,b) for(RG i=a;i<=b;i++)
    10 using namespace std;
    11 int n,m,ans;
    12 int pos[1005];
    13 struct Dat{
    14     int l,r;
    15     bool operator < (const Dat &a)const{
    16         return r<a.r;
    17     }
    18 }dat[maxn];
    19 inline int read()
    20 {
    21     int x=0,f=1;char c=getchar();
    22     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    23     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    24     return x*f;
    25 }
    26 
    27 int main()
    28 {
    29     int a,b;
    30     n=read();m=read();
    31     rep(i,1,n)    dat[i].l=read(),dat[i].r=read();
    32     sort(dat+1,dat+1+n);
    33     rep(i,1,m)    a=read(),b=read(),pos[a]+=b;
    34     rep(i,1,n)
    35     {
    36         rep(j,dat[i].l,dat[i].r)
    37             if(pos[j]){pos[j]--,ans++;break;}
    38     }
    39     printf("%d",ans);
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    yocto/bitbake 学习资源
    QEMU/KVM学习资源
    ubuntu 中创建和删除用户
    git 重命名本地和远程分支
    Ubuntu 上搭建 FTP 服务器
    gdb 常见用法
    git log 显示与特定文件相关的 commit 信息
    基于 qemu system mode 运行 arm 程序
    基于 qemu user mode 运行 aarch64 程序
    checking in(airport)
  • 原文地址:https://www.cnblogs.com/ibilllee/p/9221027.html
Copyright © 2011-2022 走看看