usaco2013 mar【懒惰的奶牛】
描述
夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在一個(gè)地方,然后只走很少的一段路,就能吃到盡可能多的美味的青草。
有N塊草坪排列在一條直線上,第i個(gè)草坪擁有g(shù)_i數(shù)量的青草,第i個(gè)草坪所在的位置是x_i。奶牛貝里斯想要在直線上選擇一個(gè)點(diǎn)作為他的初始點(diǎn)(初始點(diǎn)有可能和草坪的位置重合),這樣他就能吃到以這個(gè)點(diǎn)為中點(diǎn)距離不超過K的位置上的所有青草。
如果初始點(diǎn)可以自由選擇的話,請幫助貝里斯計(jì)算他最多能吃到的青草的數(shù)量。
輸入輸出格式
輸入
第一行是兩個(gè)正整數(shù),表示N和K。
第2行到第N+1行,每行兩個(gè)整數(shù),第i行的兩個(gè)整數(shù)表示第i個(gè)草坪的g_i和x_i。
輸出
輸出貝里斯最多能吃到的青草數(shù)量。
輸入輸出樣例
樣例輸入1
4 3 4 7 10 15 2 2 5 1樣例輸出1
11樣例說明
如果貝里斯將初始點(diǎn)選擇在x=4的位置,那么他可以吃到x=1,x=2和x=7這三個(gè)地方的青草,總共是11。
數(shù)據(jù)規(guī)模
1<=N<=100000,1<=g_i<=10000,0<=x_i<=1000000,1<=k<=2000000。
解題思路
剛開始我想用前綴和,然后每次枚舉區(qū)間比較最大值,但是我最后還是用的類似于隊(duì)列的東西來做(因?yàn)槔蠋煆?qiáng)制性),每次用一個(gè)左端點(diǎn)和右端點(diǎn)移動(dòng)就行。
題解
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,k,maxn,ans; 4 int mp[5000001];//存青草地的 5 int read()//快讀 6 { 7 int x=0,f=1; 8 char ch=getchar(); 9 while(ch<'0'||ch>'9'){ 10 if(ch=='-') 11 f=-1; 12 ch=getchar(); 13 } 14 while(ch>='0'&&ch<='9'){ 15 x=(x<<1)+(x<<3)+(ch^48); 16 ch=getchar(); 17 } 18 return x*f; 19 } 20 int main() 21 { 22 cin>>n>>k; 23 k*=2;//方便后續(xù)操作 24 for(int i=1;i<=n;i++) 25 { 26 int x,w; 27 w=read(); 28 x=read(); 29 mp[x]=w;//存入 30 } 31 int l=0,r=k,ans=0;//l一定要從0開始,我之前一個(gè)多小時(shí)WA就是因?yàn)樗? 32 for(int i=l;i<=r;i++) 33 { 34 ans+=mp[i];//求區(qū)間和 35 } 36 maxn=max(maxn,ans); 37 while(r<=5000001)//因?yàn)椴恢来笮?#xff0c;只能硬枚舉 38 { 39 ans-=mp[l];//減去左端點(diǎn)的 40 l++;//右移 41 r++;//右移 42 ans+=mp[r];//加上右端點(diǎn)的 43 maxn=max(maxn,ans);//取最優(yōu)解 44 } 45 cout<<maxn;//輸出 46 }?
轉(zhuǎn)載于:https://www.cnblogs.com/hualian/p/11185299.html
總結(jié)
以上是生活随笔為你收集整理的usaco2013 mar【懒惰的奶牛】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧行纪事之小小总结
- 下一篇: [jQuery]点击某元素之外触发事件