原题

传送门

有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值(minSPFi and maxSPFi),太大就晒伤了,太小奶牛没感觉。
而刚开始的阳光的强度非常大,奶牛都承受不住,然后奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值。
那么为了不让奶牛烫伤,又不会没有效果。
给出了L种防晒霜。每种的数量和固定的阳光强度(coveri and SPFi)也给出来了
每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛有几个。

思路

声明

minSPFi : 奶牛忍受的阳光强度最小值
maxSPFi : 奶牛忍受的阳光强度最大值
coveri : 防晒霜数量
SPFi : 防晒霜阳光强度

初始的思路(38 pts)

这是一道贪心题,但我开始时还是想错了。

我先将每头牛按照最小忍受阳光强度从小到大排序,防晒霜按照强度从小到大排序。

然后开始枚举,对于第 \(i\) 个奶牛 ,假设当前枚举到第 \(l\) 个 防晒霜 , 当其 \(SPFi < minSPFi\) , \(l++\) ,直到满足 \(SPFi \ge minSPFi\) ,而当 \(SPFi > maxSPFi\) , 则 continue ,最后判断一下防晒霜剩余个数即可判断答案

初始代码(38 pts)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXN = 2510;
int C,L,ans,l = 0; struct cow{//奶牛
int l,r;
bool operator < (const cow &b) const{
if(l == b.l) return r < b.r;
return l < b.l;
}
}a[MAXN]; struct sunscreen{//防晒霜
int SP,num;
bool operator < (const sunscreen &b) const{
return SP < b.SP;
}
}lotion[MAXN]; int main (){
scanf("%d %d",&C,&L);
for(int i = 0 ;i < C;i++) scanf("%d %d",&a[i].l,&a[i].r);
for(int i = 0 ;i < L;i++) scanf("%d %d",&lotion[i].SP,&lotion[i].num);
sort( a , a+C );
sort( lotion , lotion+L);
for(int i = 0 ;i < C;i++){
if(lotion[l].num == 0) l++; //判断个数
while ( a[i].l > lotion[l].SP && l < L-1) l++;//查找左端点是否符合条件
if( a[i].r < lotion[l].SP) continue;//右端点不符合直接跳过
lotion[l].num--;
ans++;//答案处理
}
printf("%d",ans);
return 0;
}

正解思路

然鹅,这种贪心错了。

举个例子:



按照这种算法,我们会让 1 区间使用 I ,2区间使用 J,3 区间使用 K ,答案为 3。

但是答案为4。

正确解法应该为:

先将每头牛按照最小忍受阳光强度从大到小排序,然后开始枚举,对于第 \(i\) 个奶牛 ,我们要找到它能用的防晒霜里面SPFi最大的,然后计算答案。

关于正确性

SPFi更小的显然其他没枚举到的牛很可能会被用到,于是我们拿掉SPFi最大的,具体可以见上面的图。

代码

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXN = 2510;
int C,L,ans; struct cow{
int l,r;
bool operator < (const cow &b) const{
return l > b.l;
}
}a[MAXN]; struct sunscreen{
int SP,num;
}lotion[MAXN]; int main (){
scanf("%d %d",&C,&L);
for(int i = 0 ;i < C;i++) scanf("%d %d",&a[i].l,&a[i].r);
for(int i = 0 ;i < L;i++) scanf("%d %d",&lotion[i].SP,&lotion[i].num);
sort( a , a+C );
for(int i = 0 ;i < C;i++){
int l = -1,choose = -1;
for(int j = 0;j < L;j++)//暴力枚举
if ( lotion[j].num > 0 && lotion[j].SP >= a[i].l && lotion[j].SP <= a[i].r)
if(lotion[j].SP > choose){
choose = lotion[j].SP;
l = j;
}
if( l != -1 ){
ans++;
lotion[l].num--;
}//答案处理
}
printf("%d",ans);
return 0;
}

题解 洛谷 P2287 [USACO07NOV]Sunscreen G的更多相关文章

  1. 【题解】洛谷P3119 Grass Cownoisseur G

    题面:洛谷P3119 Grass Cownoisseur G 本人最近在熟悉Tarjan的题,刷了几道蓝题后,我飘了 趾高气扬地点开这道紫题,我一瞅: 哎呦!这不是分层图吗? 突然就更飘了~~~ 用时 ...

  2. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  3. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  4. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

  5. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

  6. 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)

    题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...

  7. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  8. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  9. 题解-洛谷P6788 「EZEC-3」四月樱花

    题面 洛谷P6788 「EZEC-3」四月樱花 给定 \(n,p\),求: \[ans=\left(\prod_{x=1}^n\prod_{y|x}\frac{y^{d(y)}}{\prod_{z|y ...

随机推荐

  1. JVM对算术运算做了什么??

    java可以进行数字的加减乘除,但是JVM的运算步骤是什么样子呢?从一个神奇的式子入手,研究下JVM到底做了什么? 先看下图:

  2. Lucene5多条件查询

    lucene是一个很强大的搜索工具,最近公司项目上用到,结合JAVA1234所讲,对多条件查询做出总结 先描述一下我的多条件需求,如果和您的类似,继续往下看. 1.我的Lucene搜索会在很多地方使用 ...

  3. AndroidStudio 编译失败;Caused by: org.gradle.api.resources.ResourceException: Could not get resource..

    错误信息: Caused by: org.gradle.api.resources.ResourceException: Could not get resource 'https://jcenter ...

  4. 【asp.net core 系列】12 数据加密算法

    0. 前言 这一篇我们将介绍一下.net core 的加密和解密.在Web应用程序中,用户的密码会使用MD5值作为密码数据存储起来.而在其他的情况下,也会使用加密和解密的功能. 常见的加密算法分为对称 ...

  5. cookie和session及token

    cookie,session傻傻分不清楚? 做了这么多年测试,还是分不清什么是cookie,什么是session?很正常,很多初级开发工程师可能到现在都搞不清什么是session,cookie相对来说 ...

  6. Java并发包JUC核心原理解析

    CS-LogN思维导图:记录CS基础 面试题 开源地址:https://github.com/FISHers6/CS-LogN JUC 分类 线程管理 线程池相关类 Executor.Executor ...

  7. 动态追踪技术之SystemTap

    SystemTap SystemTap是一个深入检查Linux系统活动的工具,使用该工具编写一些简单的代码就可以轻松的提取应用或内核的运行数据,以诊断复杂的性能或者功能问题.有了它,开发者不再需要重编 ...

  8. MPC控制初长成——我陷过的误区

    真正接触控制一个多月,现记录自己的误区,以警示自己: 1 . 离散与连续 我经常会拿到连续的系统,用离散的方式去控制,然后反复找原因,还是找不到.要记住:离散和连续要分开!!!,网上的例子大都是连续的 ...

  9. dart快速入门教程 (3)

    3.运算符 运算符本质上就是代表某运算规则的符号,例如: + ,这个符号,代表着数学运算里面的加法,按照加法法则进行运算即可,同理,学习运算符就是掌握这些规则而已 3.1.算术运算符 算术运算符主要包 ...

  10. js事件入门(5)

    5.窗口事件 5.1.onload事件 元素加载完成时触发,常用的就是window.onload window.onload = function(){ //等页面加载完成时执行这里的代码 } 5.1 ...