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. 懒惰的牛相关推荐

  1. AcWing 1922. 懒惰的牛(前缀和 or 双指针)

    思路 因为数据范围很小,所以我们可以直接用前缀和的方法做,当然也可以用尺举法,后面补上 前缀和 因为x的数据范围就是1e6,那么我们直接把对应地点的值加上去就好了 #include<bits/s ...

  2. 算法小讲堂之你真的会双指针吗?

    长文预告!!! 双指针算法 双指针又被称为 尺取法 双指针是一种简单而又灵活的技巧和思想,并不是一种具体的算法,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处. 双指针顾名思义,同 ...

  3. 题目汇总(ACWing)

    枚举: 1.拍照 解题思路:枚举a1,求出每个ai,然后检查这个答案是否合法. 2.牛为什么过马路 解题思路:对于一对相同的字母,枚举中间是否存在没有记录的单个字符. 3.牛的基因组学 解题思路:暴力 ...

  4. rust最美建筑_[资料整理]动物之森的美丽物语 (多图;补完)

    Agent S 生日: July 2nd 性别: Female 口头禅: sidekick 个性: 活泼 种族: 花栗鼠 看图说话: "I'm gonna, like, save the w ...

  5. 洛谷P2849 Marathon S

    题目描述 Unhappy with the poor health of his cows, Farmer John enrolls them in an assortment of differen ...

  6. 这还是你所认知的Python吗?原来是这么牛!

    1994 年末,一群来自美国各地的程序员聚在一起,讨论他们的新式秘密武器. 这是 Python 有史以来的第一次研讨会,有 20 多名开发者参加,Barry Warsaw 是这些与会者当中的一员.他回 ...

  7. 四位科研牛人介绍的文献阅读经验

     每天保持读至少2-3 篇的文献的习惯.读文献有不同的读法,但最重要的自己总结概括这篇文献到底说了什么,否则就是白读,读的时候好像什么都明白,一合上就什么都不知道,这是读文献的大忌,既浪费时间,最 ...

  8. 牛客网 2018年全国多校算法寒假训练营练习比赛(第五场) H.Tree Recovery-完全版线段树(区间更新、区间求和)...

    H.Tree Recovery 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 链接:https:/ ...

  9. 如何成为一位牛逼的高手

    郑昀 演讲稿 创建于2016/9/15 最后更新于2016/9/21 很多人都在思考一个问题: 怎样才能想出来一个牛逼的 idea? 有一位喜欢抽烟喝酒烫头的大师 给出了答案: 这事儿吧,简单,一共分 ...

最新文章

  1. cmake find_package 中,include_directories,target_link_libraries 的值怎么知道?
  2. ubuntu通过xmange连接桌面
  3. PowerDesigner12 逆向工程DataBase SQl2005: unable to list the tables 信息
  4. python中webdriver_Linux上部署python+selenium+webdriver常见问题解决方案
  5. 5G NR 上下行资源分配
  6. Java简单输入输出
  7. 登录状态 token
  8. Java 8 lambda初试
  9. excel手机版_如何一次性将单位所有人的手机号导入手机通讯录中?
  10. 使用代码控制小米智能插座
  11. 医学CT图像三维重建代码
  12. dva 路由/导航/
  13. 数学和计算机信息专业就业前景,数学专业就业方向和就业前景
  14. 程序设计天梯赛——T1(15分)java版
  15. 吴恩达老师,被曝靠「教书」实现首个IPO上市,Coursera估值50亿美元
  16. mrmr 最大关联度-最小冗余度 特征选择
  17. python-字典附加题3- 股票查询
  18. Excel常用函数记录
  19. openpyxl对execl文件中图片编辑
  20. 推荐一个win7镜像(支持uefi,已升级补丁,带驱动)

热门文章

  1. 神经网络用于日内股票预测
  2. 分布式文件系统FastDFS的搭建
  3. ORA-12520错误解决方法
  4. 中国DM刊型广告——《分众时代》 招 商 手 册
  5. 电子竞技行业所面临的四大攻击威胁
  6. python实现lenet_LeNet - Python中的卷积神经网络
  7. Debian 10创建文件夹和删除文件夹命令
  8. WPS JS宏 打开带密码并对多工作薄多工作表进行合并实例
  9. python中的pygame弹球游戏代码_使用python和pygame制作挡板弹球游戏
  10. org.junit.Assert中的assertEquals(long,long)