題目描述
夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在乙個地方,然後只走很少的一段路,就能吃到盡可能多的美味的青草。有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。奶牛貝里斯想要在直線上選擇乙個點作為他的初始點 初始點有可能和草坪的位置重合 這樣他就能吃到以這個...