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...