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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

中石油训练赛 - 关于我转生变成史莱姆这档事(dfs)

發布時間:2024/4/11 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中石油训练赛 - 关于我转生变成史莱姆这档事(dfs) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

關于我轉生變成史萊姆這檔事這部番劇中,上班族的三上悟因為某個事件而作為史萊姆在異世界轉生了。在轉生時得到了“大賢者”和“捕食者”這兩個獨特技能。雖然身為史萊姆,但也想和其他種族建立起友好關系。魔素是異世界里面魔物含有的魔力精華,捕食者這個技能就是吞噬魔素,捕食者的技能要求非常苛刻,如果你第一天吞噬了b魔素,那么你第二天可以吞噬第一天的2~9倍(必須是其中一個整數),也就是2b~9b,也就是說,史萊姆在第i天所吞噬的魔素一定是第i-1天的2~9倍,而且還必須是它的整數倍。
作為史萊姆手下的得力助手,哥布林們準備了大量的魔物供主人食用,現在史萊姆已經知道了這些魔物含有S魔素,現在請大賢者合理安排第一天要吞噬和接下來每天需要增加的魔素倍數,好讓史萊姆能在最短的天數內恰好吞噬完魔素。由于大賢者要研究“哲學”,無暇顧及這些小事,現在只能請你幫忙,但是大賢者還建議,這些魔素至少要用兩天來吞噬。

?

輸入

一個正整數S,代表要吞噬的魔素總量。

輸出

一個數,代表要吞噬的天數,如果無解輸出-1。

樣例輸入 Copy

571

樣例輸出 Copy

5

提示

對于30%數據,有S<=100;
對于70%數據,有S<=107;
對于100%數據,有9<S<=8×108


題目分析:很玄學的一個題,因為數據范圍比較大所以一直不敢切,感覺dfs爆搜會超時,看來還是高估出題人給的數據了

首先因為每一天吞噬的魔素必須是前一天的2~9倍,那么我們設 p ∈[ 2 , 9 ] ,第一天吞噬的魔素為 a ,那么往后吞噬的總魔素的數量為:a + a*p1 + a*p1*p2 ... + a*p1*p2*...*pk ,合并同類項之后,就變成了 a * ( 1 + p1 * ( 1 + p2 * ( 1 + ...( 1 + pk ) ) ) ) ,這樣也就變成了一個中規中矩的遞歸的表達式了,對于每次最外面的 a 來說,因為?a * ( 1 + p1 * ( 1 + p2 * ( 1 + ...( 1 + pk ) ) ) ) = sum ,所以 a 一定是題目給出的 s 的一個因子,確定好第一層的因子后,直接dfs搜索就好了,記得一些特定細節的判斷就好了,本來以為直接爆搜時間復雜度會高達8^20,肯定會TLE,結果連剪枝都沒有,交上去20ms就跑完了,加了個最優性剪枝10ms就跑完了

代碼:
?

#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;vector<int>fac;int ans=20;//答案肯定不超過20,因為3^20>8e8void init(int n) {for(int i=1;i*i<=n;i++){if(n%i)continue;fac.push_back(i);if(i!=n/i)fac.push_back(n/i);}sort(fac.begin(),fac.end(),greater<int>());//排序是為了忽略因子為自身的這個元素 }void dfs(int n,int step) {if(!n){ans=step;return;}if(step>=ans)//最優性剪枝return;for(int i=2;i<=9;i++){if(i>n)break;if(n%i)continue;dfs(n/i-1,step+1);} }int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n;scanf("%d",&n);init(n);for(int i=1;i<fac.size();i++)//從1開始,忽略自身為因子的元素dfs(n/fac[i]-1,1);if(ans==20)ans=-1;printf("%d\n",ans);return 0; }

?

總結

以上是生活随笔為你收集整理的中石油训练赛 - 关于我转生变成史莱姆这档事(dfs)的全部內容,希望文章能夠幫你解決所遇到的問題。

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