牛客網 每日一題 5月9日 過河

2022-05-05 14:24:10 字數 2262 閱讀 1899

時間限制:c/c++

1秒,其他語言2秒

空間限制:c/c++

131072k,其他語言262144k

64bit io format:

%lld

在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點:0,1,……,l(其中l是橋的長度)。座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是s到t之間的任意正整數(包括s,t)。當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋。

題目給出獨木橋的長度l,青蛙跳躍的距離範圍s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。

輸入描述:

第一行有乙個正整數l(1<=l<=109),表示獨木橋的長度。

第二行有三個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離,及橋上石子的個數,其中1<=s<=t<=10,1<=m<=100。

第三行有m個不同的正整數分別表示這m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。 所有相鄰的整數之間用乙個空格隔開。

輸出描述:

只包括乙個整數,表示青蛙過河最少需要踩到的石子數。

示例1

輸入

1023

5235

67

輸出

2
備註:

對於30%的資料,l<=10000;

對於全部的資料,l<=109。

首先肯定是想到dp

dp[i]表示走到i這個位置的最小的踩石頭的次數

當從位置j調到位置i後,

如果當前位置i沒有石頭 f [ i ] = min ( f [ i ] , f [ j ] )

如果當前位置i有石頭:f[i] = min ( f [ i ], f [ j ] + 1)

就就這樣嗎?

並不是,看看資料範圍,開陣列肯定爆了,這是在逼我們做優化

我注意看除了l之外的其他資料,相比之下s,t,m都夠小的,像s,t才0到10,那兩個石頭之間距離很大的話,我們可以調整步伐使得不踩到石頭如果這樣考慮,兩個距離很遠的石頭之間,我們可以到達任意距離。那距離再長又有何影響。

那我就要考慮兩個石頭之間距離達到多少才算大呢?

[s,t]是跳躍的範圍

當距離len大於s * t時,len都至少有兩種方法可以跳到,(因為s * t等於t個s相加或者s個t相加),之後的距離都可以在修改之前的基礎上得到實現。說白了就是距離大於st之後,都可以到達,那我們把距離大的都縮小到st,這樣l的範圍不就限制住了嘛

回歸本題,s和t不重複時,s最大是9,t最大是10,s * t最大是90,也就是距離大於90的兩個石頭

所以我們只需將每兩個石頭超過 s * t 的距離縮成s * t就可以了

當s=t時,只需要列舉每個石頭的座標是否為s的倍數即可

含注釋

#include

using

namespace std;

const

int maxn =90*

105;

int s[maxn]

,a[maxn]

;int dp[maxn]

,len;

bool f[maxn]

;//標記改點是否為石頭

memset

(dp,

0x7f

,sizeof

(dp));

intmain()

for(

int i =

1; i <= m ;

++ i)

dp[0]

=0;for

(int i =

1; i <= l ;

++ i)

for(

int j = s ; j <= t ;

++ j)

}int ans =

200;

for(

int i = a[m]

; i <= l ;

++ i)

ans =

min(ans,dp[i]);

cout << ans << endl;

return0;

}

牛客網 每日一題 5月20日題目 簡單瞎搞題

比賽鏈結 輸入描述 第一行乙個數 n。然後 n 行,每行兩個數表示 li,ri。輸出描述 輸出一行乙個數表示答案。示例1 輸入512 2334 4556 輸出 26備註 1 n li ri 100 xi的是在 li ri 中任選乙個,然後構成值,所以可以用分組揹包來做 dp i j 前i個數字能否構...

牛客網 每日一題 5月19日題目精講 比賽

時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld你在打比賽,這場比賽總共有12個題 對於第i個題,你的隊伍有a i 的機率解決她 如果解決不了她呢?由於所有人討論的都很大聲 所以你有b i 的概率從左邊那個隊那裡聽...

牛客網 每日一題 5月27日題目精講 貨幣系統

在的國度中共有n種不同面額的貨幣,第i種貨幣的面額為a i 你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為n 面額陣列為a 1 n 的貨幣系統記作 n,a 在乙個完善的貨幣系統中,每乙個非負整數的金額x 都應該可以被表示出,即對每乙個非負整數x,都存在n個非負整數t i 滿足a i x...