Sunscreen POJ - 3614(贪心)
To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they're at the beach. Cow i has a minimum and maximum SPF rating (1 ≤ minSPFi ≤ 1,000; minSPFi ≤ maxSPFi ≤ 1,000) that will work. If the SPF rating is too low, the cow suffers sunburn; if the SPF rating is too high, the cow doesn't tan at all........
The cows have a picnic basket with L (1 ≤ L ≤ 2500) bottles of sunscreen lotion, each bottle i with an SPF rating SPFi (1 ≤ SPFi ≤ 1,000). Lotion bottle i can cover coveri cows with lotion. A cow may lotion from only one bottle.
What is the maximum number of cows that can protect themselves while tanning given the available lotions?
Input
* Line 1: Two space-separated integers: C and L
* Lines 2..C+1: Line i describes cow i's lotion requires with two integers: minSPFi and maxSPFi
* Lines C+2..C+L+1: Line i+C+1 describes a sunscreen lotion bottle i with space-separated integers: SPFi and coveri
Output
A single line with an integer that is the maximum number of cows that can be protected while tanning
Sample Input
3 2
3 10
2 5
1 5
6 2
4 1
Sample Output
2 题意:有C头牛,每个牛都有对阳光的承受空间【minspf,maxspf】,有L种防晒霜,每种都有SPF值和瓶数,涂到牛身上可使其只收到SPF值的阳光,每瓶只可涂一头牛,问最多几只牛可以享受阳光? 思路:
此题可以看成在一个数轴上操作。
图中矩形块就代表了牛的承受区间,我们从左到右对牛进行涂防晒霜处理,可以从图中看到,
①【0,1】位置,无牛需要防晒霜
②【1,4】位置,只有一头牛有需求,那我们直接给橙色涂
④【4,5】位置,红色牛和橙色牛都有需求,给哪只牛涂呢?
有人可能说了,前面都给橙色牛涂了,现在肯定给红色啦,对,但是如果在【4,5】之前没有防晒霜呢(就一瓶防晒霜在【4,5】位置),也就是说这瓶防晒霜面临两个选择,
我们从图中看出,那肯定也是给红色牛啦,因为红色牛快承受不住啦(该牛承受区间右边界小),也就是说再往下进行的话,马上就出了红牛的承受区间了,然而橙牛却还没有,
所以我们先给红牛,之后再瞅瞅有没有适合橙牛的。
这样就可以看出我们的策略:
①将牛按右边界从小到大排序,防晒霜按spf从小到大排序
②将牛按左边界从大到小排序,防晒霜按spf从大到小排序
回头看这问题,对于排好序的牛(假设按①方式),有两瓶防晒霜x>y,那么是选x的,因为x,y对于后面的牛来说有三种情况,
①x、y可选
②x不可选,y可选
③x、y不可选(由左边界影响)
那么我们选择小的就对后面的牛来说影响最小
并且因为选择了对后面牛最小的影响方式,该牛可以选择防晒霜,就没有必要留给下头牛,因为只算牛头数,哪头牛不是牛呢
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std; int C,L; struct Node
{
int l;
int r;
} cow[],sun[]; bool cmp1(Node a,Node b)
{
return a.l < b.l;
}
bool cmp2(Node a,Node b)
{
return a.r < b.r;
} int main()
{
scanf("%d%d",&C,&L);
for(int i=; i<=C; i++)
{
scanf("%d%d",&cow[i].l,&cow[i].r);
}
for(int i=; i<=L; i++)
{
scanf("%d%d",&sun[i].l,&sun[i].r);
}
sort(cow+,cow++C,cmp2);
sort(sun+,sun++L,cmp1);
int ans = ;
for(int i=; i<=C; i++)
{
for(int j=; j<=L; j++)
{
if(cow[i].l <= sun[j].l && cow[i].r >= sun[j].l && sun[j].r)
{
ans++;
sun[j].r--;
break;
}
}
}
printf("%d\n",ans);
}
优先队列写法:
#include<bits/stdc++.h>
using namespace std; int C,L;
struct Node
{
int l;
int r;
bool operator<(Node b)
{
return l < b.l;
}
} cow[],sun[];
priority_queue<int,vector<int>,greater<int> >que;
int main()
{
scanf("%d%d",&C,&L);
for(int i=; i<=C; i++)
scanf("%d%d",&cow[i].l,&cow[i].r);
for(int i=; i<=L; i++)
scanf("%d%d",&sun[i].l,&sun[i].r);
sort(cow+,cow++C);
sort(sun+,sun++L);
int j = ;
int ans = ;
for(int i=; i<=L; i++)
{
while(j<=C&&cow[j].l <= sun[i].l)
que.push(cow[j].r),j++;
while(!que.empty() && sun[i].r)
{
int tmp = que.top();
que.pop();
if(tmp >= sun[i].l)
ans++,sun[i].r--;
}
}
printf("%d\n",ans);
}
Sunscreen POJ - 3614(贪心)的更多相关文章
- Heap:Sunscreen(POJ 3614)
晒太阳 题目大意:一堆牛,为了避免晒太阳会灼烧自己,然后他们自己有自己的防晒指数(一个区间),防晒霜可以提高防晒因数SPF,大了不行小了不行,现在有一桶防晒霜,他们提供一定的SPF,但是最多可以提供k ...
- POJ 3614 Sunscreen 贪心
题目链接: http://poj.org/problem?id=3614 Sunscreen Time Limit: 1000MSMemory Limit: 65536K 问题描述 to avoid ...
- poj -3614 Sunscreen(贪心 + 优先队列)
http://poj.org/problem?id=3614 有c头奶牛在沙滩上晒太阳,每头奶牛能忍受的阳光强度有一个最大值(max_spf) 和最小值(min_spf),奶牛有L种防晒霜,每种可以固 ...
- 【POJ 3614 Sunscreen】贪心 优先级队列
题目链接:http://poj.org/problem?id=3614 题意:C头牛去晒太阳,每头牛有自己所限定的spf安全范围[min, max]:有L瓶防晒液,每瓶有自己的spf值和容量(能供几头 ...
- POJ 3614:Sunscreen 贪心+优先队列
Sunscreen Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5378 Accepted: 1864 Descrip ...
- POJ 3614 Sunscreen(贪心,区间单点匹配)
把牛的SPF看作一个区间,防晒霜看作点.一个点可以匹配C[i]次,问最大匹配数.可以用图论做. 也可以贪心.贪心的思想是,把区间和点排序以后,考虑最左边的点,加入和这个点相交的区间, 并排除出界的区间 ...
- POJ 3614 Sunscreen 优先队列 贪心
题意 有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉. 而刚开始的阳光的强度非常大,奶牛都承受不住 ...
- poj 3614 Sunscreen
...
- 【POJ 3614】 Sunscreen
[题目链接] http://poj.org/problem?id=3614 [算法] 将MinSPF从大到小排序,每头牛找SPF值最大的防晒霜 [代码] #include <algorithm& ...
随机推荐
- Android组件化demo实现以及遇坑分享
首先贴出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android组件化demo 作者:TenzLiu原文链接:https://www.jianshu ...
- 【Linux】基本命令操作
一.用户操作 1.新增用户 useradd -u 1101 -g zte -d /home/xhs -m xhs --其中,1101,为用户ID,尽量使用500以上的 zte,为用户组 /home/x ...
- 再谈树形dp
上次说了说树形dp的入门 那么这次该来一点有难度的题目了: UVA10859 Placing Lampposts 给定一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都与灯相邻(被灯照亮 ...
- Let the Balloon Rise <map>的应用
Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the ...
- Python关于类的实操
实操一:总结 1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性? 2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性? 3.什么是解除绑定的函数,如何定义,如何调用,给 ...
- Python判断字符串是否xx开始或结尾
判断是否xx开始 使用startswith 示例代码: String = "12345 上山打老虎" if str(String).startswith('1'): #判断Stri ...
- ubuntu下如何编译C语言
ubuntu下如何编译C语言 如果没有gcc编译器的话,使用以下命令获取 ~# sudo apt-get install gcc同时要下载辅助工具 ~# sudo apt-get instal ...
- How does exercise keep your brain young?
Exercise may protect the brain from disease and dementia as we age, but the mechanisms behind its be ...
- Windows10右键添加“在此处打开命令窗口”
cmdHere.reg: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere] @= ...
- 如何保证Redis的高并发
单机的redis几乎不太可能说QPS超过10万+,一般在几万. 除非一些特殊情况,比如你的机器性能特别好,配置特别高,物理机,维护做的特别好,而且你的整体的操作不是太复杂. Redis通过主从架构,实 ...