日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar

發布時間:2023/10/18 编程问答 85 如意码农

2023-08-06:小青蛙住在一條河邊, 它想到河對岸的學校去學習

小青蛙打算經過河里 的石頭跳到對岸

河里的石頭排成了一條直線, 小青蛙每次跳躍必須落在一塊石頭或者岸上

給定一個長度為n的數組arr,表示每塊兒石頭的高度數值

每塊石頭有一個高度, 每次小青蛙從一塊石頭起跳

這塊石頭的高度就會下降1, 當石頭的高度下降到0時

小青蛙不能再跳到這塊石頭上(跳躍后使石頭高度下降到0是允許的)

小青蛙一共需要去學校上x天課, 所以它需要往返x次(去x次,回x次)

當小青蛙具有 一個跳躍能力y時, 它能跳不超過y的距離。

請問小青蛙的跳躍能力至少是多少才能用這些石頭上完x次課?

1 <= n <= 10^5,

1 <= arr[i] <= 10^4,

1 <= x <= 10^9。

來自藍橋杯練習題。

來自左神

答案2023-08-06:

大體步驟如下:

1.讀取輸入:從輸入中讀取每塊石頭的高度數值和小青蛙需要上課的天數x。

2.初始化變量和數組:定義一個長度為n的數組help用于保存每塊石頭的高度數值的累積和。初始化變量ans為0。

3.計算累積和:遍歷數組arr中的每個元素,計算它們的累積和,并保存到數組help中。

4.計算最小跳躍能力:使用雙指針法逐個計算每個起點石頭l到終點石頭r的跳躍能力。在每次迭代中,通過移動r指針使得help[r] - help[l-1] >= 2*x,即小青蛙能從起點石頭跳躍到終點石頭。同時,更新ans為當前最大的能連續跳躍的石頭數量。

5.返回結果:返回ans作為小青蛙的最小跳躍能力。

總的時間復雜度為O(n),總的空間復雜度為O(n)。

go完整代碼如下:

package main

import (
"fmt"
) const MAXN = 100001 var help [MAXN]int
var n, x int
var sc = []int{5, 1, 1, 0, 1, 0}
var ii = 0 func next() int {
ii++
return sc[ii-1]
} func hasNext() bool {
return ii < len(sc)
} func main() {
for hasNext() {
n = next()
x = next() for i := 1; i < n; i++ {
val := next()
help[i] = help[i-1] + val
}
fmt.Println(minAbility())
}
} // O(N)的最優解
func minAbility() int {
ans := 0
for l, r := 1, 1; l < n; l++ {
for r < n && help[r]-help[l-1] < 2*x {
r++
}
ans = max(ans, r-l+1)
}
return ans
} func max(a, b int) int {
if a > b {
return a
}
return b
}

rust完整代碼如下:

const MAXN: usize = 100001;

static mut HELP: [i64; MAXN] = [0; MAXN];
static mut N: i64 = 0;
static mut X: i64 = 0;
static mut SC: [i64; 6] = [5, 1, 1, 0, 1, 0];
static mut II: usize = 0; fn next() -> i64 {
unsafe {
II += 1;
SC[II - 1]
}
} fn has_next() -> bool {
unsafe { II < SC.len() }
} fn main() {
unsafe {
while has_next() {
N = next();
X = next(); for i in 1..N {
let val = next();
HELP[i as usize] = HELP[i as usize - 1] + val;
}
println!("{}", min_ability());
}
}
} // O(N)的最優解
fn min_ability() -> i64 {
let mut ans: i64 = 0;
unsafe {
let mut l: i64 = 1;
let mut r: i64 = 1;
while l < N {
while r < N && HELP[r as usize] - HELP[(l - 1) as usize] < 2 * X {
r += 1;
}
ans = max(ans, r - l + 1);
l += 1;
}
}
ans
} fn max(a: i64, b: i64) -> i64 {
if a > b {
a
} else {
b
}
}

c++完整代碼如下:

#include <stdio.h>

#define MAXN 100001

int help[MAXN];
int n, x;
int sc[] = { 5, 1, 1, 0, 1, 0 };
int ii = 0; int next() {
ii++;
return sc[ii - 1];
} int hasNext() {
return ii < sizeof(sc) / sizeof(sc[0]);
} int min(int a, int b) {
return (a < b) ? a : b;
} int max(int a, int b) {
return (a > b) ? a : b;
} int minAbility() {
int ans = 0;
for (int l = 1, r = 1; l < n; l++) {
while (r < n && help[r] - help[l - 1] < 2 * x) {
r++;
}
ans = max(ans, r - l + 1);
}
return ans;
} int main() {
while (hasNext()) {
n = next();
x = next(); for (int i = 1; i < n; i++) {
int val = next();
help[i] = help[i - 1] + val;
}
printf("%d\n", minAbility());
} return 0;
}

c完整代碼如下:

#include <stdio.h>

#define MAXN 100001

int help[MAXN];
int n, x;
int sc[] = { 5, 1, 1, 0, 1, 0 };
int ii = 0; int next() {
ii++;
return sc[ii - 1];
} int hasNext() {
return ii < sizeof(sc) / sizeof(sc[0]);
} int min(int a, int b) {
return (a < b) ? a : b;
} int max(int a, int b) {
return (a > b) ? a : b;
} int minAbility() {
int ans = 0;
for (int l = 1, r = 1; l < n; l++) {
while (r < n && help[r] - help[l - 1] < 2 * x) {
r++;
}
ans = max(ans, r - l + 1);
}
return ans;
} int main() {
while (hasNext()) {
n = next();
x = next(); for (int i = 1; i < n; i++) {
int val = next();
help[i] = help[i - 1] + val;
}
printf("%d\n", minAbility());
} return 0;
}

總結

以上是生活随笔為你收集整理的2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。