牛客演算法入門課練習賽2題解

2021-10-14 12:02:03 字數 3569 閱讀 7955

a.古老的牛市,遺跡的天梯題目描述

牛市,乙個擁有悠久歷史的城市,2023年考古學家在牛市發現了乙個神秘的遺跡,這些勇敢而智慧型的古隊員準備進入這個遺跡,但要進入這個遺跡就需要通過一段天梯。而登上天梯必須要按照它要求的方法,否則就無法登上。它要求的方法為:

可以直接登上比當前位置高1個單位高度的天梯。

可以從當前階梯往下退一級天梯(第一級天梯除外)。

在連續退k步後,跳躍一次,跳躍的高度不超過2^k。比如說你現在位於第i級天梯,且之前從第i+k級天梯退下來,此時你可以跳到高度不超過(當前高度+ 2^k)的任何一級天梯。每一次跳躍只算一次移動哦!

開始的時候考古小隊在第一級天梯。請你計算出最少的移動步數以登上最高一級天梯。

為何考古搞得跟遊戲歷險一樣?牛市一定是乙個魔性的城市!

輸入描述:

第1行:乙個整數n,表示天梯級數。

第2行:n個整數,依次為每層天梯梯的高度,保證遞增。

題解

設f[i]為到達第i個階梯所需要的最少步數,可以從一下狀態轉移來:

第乙個方程就是直接跳,第二個中的j表示從第j的階梯跳到第i個階梯,k表示從j後退k步,按照題意來就行了

時間複雜度為o(n^3),是可以通

**

#includeusing namespace std;

#define fi first

#define se second

#define lowbit(x) x&(-x)

#define iter set::iterator

typedef long long ll;

typedef pairpii;

typedef pairpll;

const int n = 1e5+5;

const ll mod = 1e18+7;

const int inf = 0x3f3f3f3f;

const int dir[4][2]=;

const int exdir[4][2]=;

ll qpow(ll x,ll y)

return ans%mod;

}int a[201],dp[201];

void solve()}}

if(dp[n]==inf)dp[n]=-1;

cout<>t;

//while(t--)solve(),cout<

solve();

return 0;

}

b.幾乎毀滅牛市的流星雨題解看起來是dp,其實就是模擬一下,每一次向四周走一步,看看能不能到達安全區(bfs),到達就輸出答案,如果走不動了,就是不可能了,棋盤範圍設定305就好**

#includeusing namespace std;

#define fi first

#define se second

#define pb push_back

#define mp make_pair

#define lowbit(x) x&(-x)

typedef long long ll;

typedef pairpii;

typedef pairpll;

const int n = 5e4+5;

const ll mod = 1e9+7;

const int inf = 0x3f3f3f3f;

const double eps =1e-9;

const double pi=acos(-1.0);

const int dir[8][2]=;

ll qpow(ll x,ll y)

return ans%mod;

}struct nodea[n];

bool cmp(node x,node y)

}sort(a+1,a+1+m,cmp);

for(int i=0;i<=1005;i++)

cnt++;

}vectorvv;

for(int j=0;j<305;j++)}}

}int main();

ll qpow(ll x,ll y)

return ans%mod;

}int n,t[n],ans;

void solve()

if(n==3)ans+=t[1]+t[2]+t[3];

if(n==2)ans+=t[2];

if(n==1)ans+=t[1];

cout<>t;

//while(t--)solve(),cout<e.牛牛的旅遊紀念品

題目描述

牛牛在牛市的旅遊紀念商店裡面挑花了眼,於是簡單粗暴的牛牛決定——買最受歡迎的就好了。

但是牛牛的揹包有限,他只能在商店的n個物品裡面帶m個回去,不然就裝不下了。

並且牛牛希望買到的紀念品不要太相似,所以導購小姐姐幫助牛牛把紀念品全部排成了一行,牛牛只需要讓選出來要買的m個物品中任意兩個的位置差都大於等於k就行了。

現在告訴你這n個物品排成一行之後的受歡迎程度(可能是負數),求牛牛帶回去的m個物品的最大歡迎度之和。

輸入描述:

第一行三個數n,m,k

接下來一行,有n個整數,是n個物品按順序的受歡迎程度。

題解

設dp[i][j]表示前 i 個數中取 j 個數所能得到的最大值

那麼就可以得dp方程

如果i-k>0,那麼

如果j==1,那麼

初始全部-inf**

#includeusing namespace std;

#define fi first

#define se second

#define pb push_back

#define mp make_pair

#define lowbit(x) x&(-x)

typedef long long ll;

typedef pairpii;

typedef pairpll;

const int n = 1e5+5;

const ll mod = 1e9+7;

const int inf = 0x3f3f3f3f;

const double eps =1e-9;

const double pi=acos(-1.0);

const int dir[8][2]=;

ll qpow(ll x,ll y)

return ans%mod;

}int dp[10001][101],a[10001];

void solve()

}cout<>t;

//while(t--)solve(),cout<

solve();

return 0;

}

2023年牛客演算法入門課練習賽2

dp題,沒做上來qaq include using namespace std const int inf 0x3f3f3f3f int h 205 dp 205 dp i 跳到第i級階梯的最小步數 intmain void dp 1 0 for int i 2 i n i dp maxh min ...

牛客練習賽22題解

簡單瞎搞題 不會用bitset,所以沒做出來。實際上還是比較簡單的。include using namespace std bitset 1000005 dp 2 int main cout 2 count 簡單資料結構1 這裡要運用拓展尤拉定理。ab modp ab p b p p 0 modp ...

題解 牛客練習賽51

字首a的數量,字尾c的數量,遇到b就計算一次答案。includeusing namespace std typedef long long ll const int n 1e5 100 char s n int cnt n int main int tmp 0 for int i 1 i n i p...