Problem Description

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头牛晒太阳,每头牛有一个防晒范围,太低会晒伤,太高不能晒的充分,已知有L种防晒霜以及他们的数量与防晒范围,现给牛涂防晒霜,问有多少头牛能充分晒到太阳。

思路

一开始只想到了用贪心算法,将牛按照防晒范围的最小值升序排序,对每一种防晒霜,找出上限大于他且下限小于他的牛跟他匹配,枚举所有防晒霜,将所有符合最小值小于该防晒霜的奶牛的最大值存储,然后记录答案。

错误代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 2501
#define MOD 1001
#define E 1e-12
using namespace std;
struct Node{int minn;int maxx;
}spf[N];
int num[1001];//存储每一种防晒霜的防晒范围
bool vis[1001];//判断防晒霜是否被用过
bool cmp(Node a,Node b)
{if(a.maxx==b.maxx)return a.minn>b.minn;return a.maxx<b.maxx;
}
int main()
{int c,l;scanf("%d%d\n",&c,&l);for(int i=1;i<=c;i++)//奶牛的防晒范围scanf("%d%d",&spf[i].minn,&spf[i].maxx);for(int i=1;i<=l;i++)//桶排存储每种防晒霜的防晒值{int x,y;scanf("%d%d",&x,&y);num[x]+=y;}int cnt=0;sort(spf+1,spf+c+1,cmp);for(int i=1;i<=1000;i++)//枚举每一种防晒霜for(int j=1;j<=num[i];j++)//枚举每一种防晒霜的防晒值for(int k=1;k<=c;k++)//枚举每一头牛if(spf[k].minn<=i&&i<=spf[k].maxx&&vis[k]==0)//如果当前的防晒霜未被用过且符合牛的防晒范围{cnt++;vis[k]=1;break;}printf("%d\n",cnt);return 0;
}

WA多次,查看大量题解后发现需要用优先队列,将奶牛按照防晒范围的最小值升序排序,将防晒霜也按照防晒值升序排序,从最小的防晒霜枚举,将最小值小于等于该防晒霜的奶牛的最大值放入优先队列之中,然后优先队列最小值先出,就可将这些最大值中的最小的取出来,更新答案。

Source Program

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 2501
#define MOD 1001
#define E 1e-12
using namespace std;
struct Cow
{int maxx;int minn;
}cow[N],cc;
struct Sunscreen
{int sum;int ans;
}sunscreen[N],ss;
priority_queue<int, vector<int>, greater<int> > q;
bool cmp1(Cow x,Cow y)
{return x.minn<y.minn;
}
bool cmp2(Sunscreen x,Sunscreen y)
{return x.ans<y.ans;
}
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)//牛的防晒范围scanf("%d%d",&cow[i].minn,&cow[i].maxx);for(int i=1;i<=m;i++)//防晒霜的防晒值scanf("%d%d",&sunscreen[i].ans,&sunscreen[i].sum);sort(cow+1,cow+1+n,cmp1);//按牛的防晒下限升序排序sort(sunscreen+1,sunscreen+1+m,cmp2);//按防晒霜的防晒值升序排序int ans=0;int j=1;for(int i=1;i<=m;i++){while(j<=n&&cow[j].minn<=sunscreen[i].ans)//从最小的防晒霜枚举,将最小值小于等于该防晒霜的奶牛的最大值放入优先队列{q.push(cow[j].maxx);j++;}while(sunscreen[i].sum!=0&&!q.empty())//优先队列最小值先出,可将所有最大值中的最小值取出,更新答案{int k=q.top();q.pop();if(k>=sunscreen[i].ans){ans++;sunscreen[i].sum--;}}}printf("%d\n",ans);return 0;
}

Sunscreen(POJ-3416)相关推荐

  1. Bailian2734 十进制到八进制【入门】(POJ NOI0113-45)

    问题链接:POJ NOI0113-45十进制到八进制 2734:十进制到八进制 总时间限制: 1000ms 内存限制: 65536kB 描述 把一个十进制正整数转化成八进制. 输入 一行,仅含一个十进 ...

  2. Bailian2676 整数的个数【入门】(POJ NOI0105-11)

    问题链接:POJ NOI0105-11 整数的个数 2676:整数的个数 总时间限制: 1000ms 内存限制: 65536kB 描述 给定k(1 < k < 100)个正整数,其中每个数 ...

  3. Bailian4029 数字反转【进制】(POJ NOI0105-29)

    问题链接:POJ NOI0105-29 数字反转 4029:数字反转 总时间限制: 1000ms 内存限制: 65535kB 描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数 ...

  4. Bailian2735 八进制到十进制【入门】(POJ NOI0113-46)

    问题链接:POJ NOI0113-46 八进制到十进制 2735:八进制到十进制 总时间限制: 1000ms 内存限制: 65536kB 描述 把一个八进制正整数转化成十进制. 输入 一行,仅含一个八 ...

  5. Silver Cow Party (POJ - 3268 )

    Silver Cow Party (POJ - 3268 ) 这道题是我做的最短路专题里的一道题,但我还没做这个,结果比赛就出了,真是.......... 题目: One cow from each ...

  6. 吴昊品游戏核心算法 Round 7 —— 熄灯游戏AI(有人性的Brute Force)(POJ 2811)

    暴力分为两种,一种属于毫无人性的暴力,一种属于有人性 的暴力.前面一种就不说了,对于后面一种情况,我们可以只对其中的部分问题进行枚举,而通过这些子问题而推导到整个的问题中.我称之为有人性的Brute ...

  7. 【二分】Best Cow Fences(poj 2018)

    Best Cow Fences poj 2018 题目大意: 给出一个正整数数列,要你求平均数最大,长度不小于M的字串,结果乘1000取整 输入样例 10 6 6 4 2 10 3 8 5 9 4 1 ...

  8. 昂贵的聘礼(poj 1062)

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  9. 主席树学习小结(POJ 2104)

    在高中的时候就听到过主席树了,感觉非常高端,在寒假的时候 winter homework中有一题是查找区间第K大的树,当时就开始百度这种网上的博客,发现主席树看不懂,因为那个root[i],还有tx[ ...

  10. A - TOYS(POJ - 2318) 计算几何的一道基础题

    Calculate the number of toys that land in each bin of a partitioned toy box. 计算每一个玩具箱里面玩具的数量 Mom and ...

最新文章

  1. 异步方法顺序调用问题
  2. Redis 实现限流的三种方式
  3. Web - 客户端存储的几种方式
  4. redis 流 stream的使用总结 - 消费者组
  5. 三维重建15:最近遇到的-标定-EKF-优化方法等
  6. c语言创建一个根结点,创建一个由10个节点组成的二叉树结构,并按前根、中根、后根对该二叉树进行遍历,并输出遍历结果(c语言)...
  7. 宝塔linux上传文件视频,使用宝塔linux面板上传文件 解压缩zip和tar.gz
  8. ASP.NET MVC源码分析系列
  9. php 转换带声调的字幕,PHP 汉字、拼音、unicode、声母、韵母互相转换
  10. 什么是基站定位?基站定位的原理及特点
  11. word endnote插入仅出现大括号问题解决
  12. PDF中的图片如何提取出来?分享两种提取方法
  13. Android -窗口小部件开发(App Widgets) 3部分
  14. 优化算法之指数加权平均详解
  15. Android 音频可视化
  16. RecyclerView实现竖向无限循环滚动的列表
  17. c语言峰值保持算法,led频谱显示带峰值保持
  18. android手机拍照,如何用Android手机拍摄 Android手机拍摄技巧汇总【详细介绍】
  19. RFID动物耳标识读器在科学养猪中的应用
  20. 常用正则大全,npm包vue-canonical-encyclopedia,以及如何在Vue、React等项目实际开发当中使用vue-canonical-encyclopedia

热门文章

  1. 华为的数字化转型与数据治理
  2. 2018世界幸福指数中国排第86,这种报告是怎样做出来的?
  3. 小程序开发提示没有npm路径_百度小程序三个框架的各自的特点
  4. 员工离职时被HR回复“猝死了再说”!HR道歉:没控制好情绪
  5. Hollis要转行了?
  6. 【快讯】JeecgBoot低代码平台,成功入选2021科创中国·开源创新榜
  7. 七步从Angular.JS菜鸟到专家(1):如何开始
  8. 半监督学习【机器学习】
  9. 【计算机视觉】【车辆识别】--Matlab实现
  10. LoadRunner12安装说明以及问题解决