懶惰的奶牛

2021-10-07 12:23:59 字數 2111 閱讀 5845

題目描述

夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在乙個地方,然後只走很少的一段路,就能吃到盡可能多的美味的青草。有n塊草坪排列在一條直線上,第i個草坪擁有g_i數量的青草,第i個草坪所在的位置是x_i。奶牛貝里斯想要在直線上選擇乙個點作為他的初始點(初始點有可能和草坪的位置重合),這樣他就能吃到以這個點為中點距離不超過k的位置上的所有青草。如果初始點可以自由選擇的話,請幫助貝里斯計算他最多能吃到的青草的數量。

輸入

第一行是兩個正整數,表示n和k。

第2行到第n+1行,每行兩個整數,第i行的兩個整數表示第i個草坪的g_i和x_i。

輸出

輸出貝里斯最多能吃到的青草數量。

樣例輸入

4 34 7

10 15

2 25 1

樣例輸出

11資料範圍限制

1<=n<=100000,1<=g_i<=10000,0<=x_i<=1000000,1<=k<=2000000。

提示

如果貝里斯將初始點選擇在x=4的位置,那麼他可以吃到x=1,x=2和x=7這三個地方的青草,總共是11。

題目大意

輸入n組數,給出每一組數的位置x[i]和每組數的數值g[i]。求從任意某點開始不出k能收集到的最大的數值。

題目解析(兩種解法)

1.(暴力)我們為了節省時間複雜度,可以開乙個字首和陣列pre[i]。然後開始列舉每乙個點前面2k範圍以內可以收集到的數(所以下面的迴圈是倒著來的),然後直接暴力做出最大值就好了。(我這個程式還是90分……但大家也是可以學思路的)

這裡說一下這個字首和求一段值,我們可以這樣求pre[i]-pre[i-k*2-1],重點:要-1。

#include

using

namespace std;

long

long n,k,g[

100005

],x[

100005

],f[

1000005

],m=

1000005

,pre[

1000005

],ans=-1

;long

long

max(

long

long a,

long

long b)

void

putin()

for(

long

long i=

1;i<=m;

++i)

pre[i]

=pre[i-1]

+f[i];}

intmain()

2.(貪心,求學老曾zhy_learn的思路程式都是他的)求最大值,那貪心是可以考慮的一種方法。我們可以將輸入的資料快排跑一遍,這樣無疑會大大減少後續的時間。

#include

using

namespace std;

struct nodea[

100005];

bool

cmp(node x,node y)

int n,k,l,r,ma,ans,u=1;

intmain()

sort

(a+1

,a+1

+n,cmp)

; l=a[1]

.v;for

(int i=

1;i<=n;i++)}

} ans=

max(ma,ans)

;printf

("%d"

,ans)

;fclose

(stdin);

fclose

(stdout);

return0;

}//by zhy_learn

這兩種解法中,第一種會比第二種要快一點的,畢竟第二種沒有用到字首和優化。在這裡,謝謝老曾的指導!好了,那這道題就這麼完成了。

SSL ZYC 懶惰的奶牛

題目大意 在乙個平面內,一頭奶牛只能吃距離它k步的地點上的草。請問這只奶牛最多能吃到多少草?思路 一開始看到這道題時一頭霧水,以為要像懶惰的奶牛 一樣,把平面轉換成直線。但是想了一下,發現對於不確定的點f i j 我們無法確定每個點距離它多少公尺,列舉的話必然超時。在草稿紙上畫了幾下之後,我發現了這...

懶惰的奶牛(b)

這道題目是比賽的第一題,不算難但是要注意細節。題目描述 夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在乙個地方,然後只走很少的一段路,就能吃到盡可能多的美味的青草。有n塊草坪排列在一條直線上,第i個草坪擁有g i數量的青草,第i個草坪所在的位置是x i。奶牛貝里斯想要在直線上選擇乙個點作為他的初...

usaco2013 mar 懶惰的奶牛

夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在乙個地方,然後只走很少的一段路,就能吃到盡可能多的美味的青草。有n塊草坪排列在一條直線上,第i個草坪擁有g i數量的青草,第i個草坪所在的位置是x i。奶牛貝里斯想要在直線上選擇乙個點作為他的初始點 初始點有可能和草坪的位置重合 這樣他就能吃到以這個...