1922. 懒惰的牛
1922. 懒惰的牛
这是一个炎热的夏日。
懒洋洋的奶牛贝茜想将自己放置在田野中的某个位置,以便可以在短距离内尽可能多地吃到美味的草。
贝茜所在的田野中共有 N 片草地,我们可以将田野视作一个一维数轴。
第 i 片草地中包含 gi 单位的青草,位置坐标为 xi。
不同草地的位置不同。
贝茜想选取田野中的某个点作为她的初始位置(可能是某片草地所在的点)。
只有一片草地与她的初始位置的距离不超过 K 时,贝茜才能吃到那片草地上的草。
如果贝茜选择最佳初始位置,请确定她可以吃到的青草最大数量。
输入格式
第一行包含两个整数 N 和 K。
接下来 N 行,每行描述一片草地,包含两个整数 gi 和 xi。
输出格式
输出如果贝茜选择最佳初始位置,则她可以吃到的青草最大数量。
数据范围
1≤N≤105,
1≤gi≤10000,
0≤xi≤106,
1≤K≤2×106
输入样例:
4 3
4 7
10 15
2 2
5 1
输出样例:
11
样例解释
最佳初始位置选择为 x=4,可以吃到 x=1,x=2,x=7 处的青草。
解法1:前缀和
牛的位置为i,牛只能吃到位置 [ i-k ,i+k ] 之间的青草,所以我们只需要计算该数组的前缀和,S[i+k]-S[i-k-1] 即可得到该区间的青草总量。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1000010;
int S[N],a[N];//S前缀和数组,a存储青草int main()
{int n,k;cin>>n>>k;for(int i=1;i<=n;i++){int g,x;scanf("%d%d",&g,&x);a[x]+=g;}for(int i=0;i<N;i++) {S[i+1]+=S[i]+a[i];//计算前缀和,这里我们从1开始到N}int res=-1;for(int i=0;i<N;i++) {int l = max(1, i - k), r = min(i + k, N);//防止越界res=max(res,S[r]-S[l-1]);}cout<<res;return 0;
}
解法2:差分
我们从草的角度看,每个坐标的草能影响的区域是他左右为k的距离,那么就是说只要牛在这个区域里面,就一定可以吃到这个草。即牛能吃到的草的范围,一定在草的影响区域里面。那么我们就可以对草的影响区域加上gi, 就是差分的思想,最后对差分数组求和就可以得到草量最大的坐标。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1000010;
int b[N];//差分数组int main()
{int n,k;cin>>n>>k;for(int i=1;i<=n;i++){int g,x;scanf("%d%d",&g,&x);int l=max(x-k,0),r=min(x+k,N-1);//防止越界b[l]+=g;b[r+1]-=g;}int res=-1;for(int i=0;i<N;i++) {b[i]+=b[i-1];//差分res=max(res,b[i]);}cout<<res;return 0;
}
解法3:双指针
用双指针 i,j 来维护一个2k的区间,计算该区间的青草总量
#include<iostream>
#include<algorithm>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N = 1000010;
PII q[N];int main()
{int n,k;cin>>n>>k;for(int i=0;i<n;i++) scanf("%d%d",&q[i].y,&q[i].x);sort(q,q+n);int res=0,sum=0;for(int i=0,j=0;i<N;i++) //i右指针,j左指针{sum+=q[i].y;//i右移,每右移一位就加上该位置的草,直到超出2kwhile(q[i].x-q[j].x>2*k) {sum-=q[j].y;//减去不在区间内的草j++;//左指针后移}res=max(res,sum);}cout<<res;return 0;
}
1922. 懒惰的牛相关推荐
- AcWing 1922. 懒惰的牛(前缀和 or 双指针)
思路 因为数据范围很小,所以我们可以直接用前缀和的方法做,当然也可以用尺举法,后面补上 前缀和 因为x的数据范围就是1e6,那么我们直接把对应地点的值加上去就好了 #include<bits/s ...
- 算法小讲堂之你真的会双指针吗?
长文预告!!! 双指针算法 双指针又被称为 尺取法 双指针是一种简单而又灵活的技巧和思想,并不是一种具体的算法,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处. 双指针顾名思义,同 ...
- 题目汇总(ACWing)
枚举: 1.拍照 解题思路:枚举a1,求出每个ai,然后检查这个答案是否合法. 2.牛为什么过马路 解题思路:对于一对相同的字母,枚举中间是否存在没有记录的单个字符. 3.牛的基因组学 解题思路:暴力 ...
- rust最美建筑_[资料整理]动物之森的美丽物语 (多图;补完)
Agent S 生日: July 2nd 性别: Female 口头禅: sidekick 个性: 活泼 种族: 花栗鼠 看图说话: "I'm gonna, like, save the w ...
- 洛谷P2849 Marathon S
题目描述 Unhappy with the poor health of his cows, Farmer John enrolls them in an assortment of differen ...
- 这还是你所认知的Python吗?原来是这么牛!
1994 年末,一群来自美国各地的程序员聚在一起,讨论他们的新式秘密武器. 这是 Python 有史以来的第一次研讨会,有 20 多名开发者参加,Barry Warsaw 是这些与会者当中的一员.他回 ...
- 四位科研牛人介绍的文献阅读经验
每天保持读至少2-3 篇的文献的习惯.读文献有不同的读法,但最重要的自己总结概括这篇文献到底说了什么,否则就是白读,读的时候好像什么都明白,一合上就什么都不知道,这是读文献的大忌,既浪费时间,最 ...
- 牛客网 2018年全国多校算法寒假训练营练习比赛(第五场) H.Tree Recovery-完全版线段树(区间更新、区间求和)...
H.Tree Recovery 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 链接:https:/ ...
- 如何成为一位牛逼的高手
郑昀 演讲稿 创建于2016/9/15 最后更新于2016/9/21 很多人都在思考一个问题: 怎样才能想出来一个牛逼的 idea? 有一位喜欢抽烟喝酒烫头的大师 给出了答案: 这事儿吧,简单,一共分 ...
最新文章
- cmake find_package 中,include_directories,target_link_libraries 的值怎么知道?
- ubuntu通过xmange连接桌面
- PowerDesigner12 逆向工程DataBase SQl2005: unable to list the tables 信息
- python中webdriver_Linux上部署python+selenium+webdriver常见问题解决方案
- 5G NR 上下行资源分配
- Java简单输入输出
- 登录状态 token
- Java 8 lambda初试
- excel手机版_如何一次性将单位所有人的手机号导入手机通讯录中?
- 使用代码控制小米智能插座
- 医学CT图像三维重建代码
- dva 路由/导航/
- 数学和计算机信息专业就业前景,数学专业就业方向和就业前景
- 程序设计天梯赛——T1(15分)java版
- 吴恩达老师,被曝靠「教书」实现首个IPO上市,Coursera估值50亿美元
- mrmr 最大关联度-最小冗余度 特征选择
- python-字典附加题3- 股票查询
- Excel常用函数记录
- openpyxl对execl文件中图片编辑
- 推荐一个win7镜像(支持uefi,已升级补丁,带驱动)
热门文章
- 神经网络用于日内股票预测
- 分布式文件系统FastDFS的搭建
- ORA-12520错误解决方法
- 中国DM刊型广告——《分众时代》 招 商 手 册
- 电子竞技行业所面临的四大攻击威胁
- python实现lenet_LeNet - Python中的卷积神经网络
- Debian 10创建文件夹和删除文件夹命令
- WPS JS宏 打开带密码并对多工作薄多工作表进行合并实例
- python中的pygame弹球游戏代码_使用python和pygame制作挡板弹球游戏
- org.junit.Assert中的assertEquals(long,long)