poj --3614 Sunscreen

http://poj.org/problem?id=3614

 

题意

有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉。

而刚开始的阳光的强度非常大,奶牛都承受不住,然后奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值。

那么为了不让奶牛烫伤,又不会没有效果。

给出了L种防晒霜。每种的数量和固定的阳光强度也给出来了

每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛最多有几个。

分析:

设C个奶牛的防晒区间分别为 (L1,R1) ( L2 , R2 ) ( L3 ,R3)  ……( Ln ,Rn) ,L 种防晒霜(SPF1, num1)   (SPF2,num2)  …… (SPFn,  num n)

①要想使尽可能多的奶牛能够享受阳光, 主要取决于防晒霜,应尽量使防晒霜SPF小的应用于防晒区间小的,并且在SPF,num值允许的情况下尽量涉及到每个区间,才是最佳的

②将C个奶牛的防晒区间按照左端点从小到大的顺序排序,左端点相同的按照右端点从小到大排序,将L种防晒霜按照防晒系数SPF从小到大排序

③从小到大遍历每种防晒霜,针对防晒霜Li ,首先确定能够被其作用的奶牛区间,即满足条件    L <= Li. SPF<=R d的奶牛区间 ,在这些区间当中优先选择R最小的那个区间,因为大区间(R比较大)的奶牛有更大的选择空间,而R小的能选择的空间比较小,让其优先使用防晒霜。这样就能保证整个过程尽可能多的奶牛使用合适的防晒霜。

 

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

struct Node
{
    int left,right;
    bool operator<(Node b)
    {
        if(left!=b.left) return left<b.left;
        else return right<b.right;
    }
};
struct Tode
{
    int value,num;
    bool operator<(Tode b)
    {
        return value<b.value;
    }
};
Node p[2550];
Tode q[2550];
int C,L;
int vis[2550];

void solve()
{
    long long Count=0,pos;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<L;)                  //遍历每种防晒霜
    {
        if(q[i].num>=1)                //判断该种防晒霜个数是否用完
        {
            int Min=999999;      
            for(int j=0;j<C;j++)       //遍历每个奶牛
            {
              if(vis[j]==0&&q[i].value>=p[j].left&&p[j].right>=q[i].value) 
                //判断奶牛是否使用过防晒霜(vis[i]==0) 判断区间用是否能用该防晒霜
              {
                if(p[j].right<Min)   //在满足条件的区间中选出 右端点最小的 使用该防晒霜
                {
                    Min=p[j].right;
                    pos=j;           //记录该区间的位置
                }
              }
              else if(p[j].left>q[i].value) break;  //已经排好序,一旦左端点大于value,后面的都>value
            }
            if(Min!=999999)           //判断是否还有适合该种防晒霜奶牛区间
            {
                Count++,vis[pos]=1;//让合适区间中右端点最小的使用 
                q[i].num--;           //该种防晒霜的个数-1
            }
            else i++;               //没有适合该种防晒霜的,跳到下一种防晒霜
        }
        else i++;                   //该种防晒霜用完了,跳到下一种防晒霜
        if(Count==C) break;         //覆盖到所有的奶牛,不用再遍历防晒霜了,跳出

    }
    cout<<Count<<endl;
}
int main()
{
        cin>>C>>L;

        for(int i=0;i<C;i++)
            cin>>p[i].left>>p[i].right;
        for(int i=0;i<L;i++)
            cin>>q[i].value>>q[i].num;
        sort(p,p+C);
        sort(q,q+L);
        solve();
    return 0;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值