牛客的兩道dfs

2022-05-22 18:45:07 字數 2250 閱讀 5757

1.傳送門:牛客13594-選擇困難症

題意:給你k類物品,每類物品有a[i]個每個物品都有乙個value,每類物品最多選乙個,要求有多少種選法使得總value>m(沒要求每類物品都必須選)

題解:很明顯是一道dfs的題,但是要剪枝優化,假設我們當前所有物品的總vaule>m,那麼我們只要算這件物品之後的組合總數就行了(特別注意每類物品可以不選,即num[0]=0,dfs每類物品的個數要從位置0開始而不是1),用乙個mul陣列來記錄每類的方案數.

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 

11 #include 12 #include 13

#define ll long long

14#define fi first

15#define se second

16#define pb push_back

17#define me memset

18const

int n = 1e6 + 10;19

const

int mod = 1e9 + 7;20

using

namespace

std;

21 typedef pairpii;

22 typedef pairpll;

2324

intk;

25 ll m,ans,a[20][200],mul[20],num[200

];26

2728

void dfs(int

pos,ll sum)

35 dfs(pos+1,sum+a[pos][i]);36}

37}3839

intmain()

47 sort(a[i]+1,a[i]+1+num[i]);48}

49 ans=0

;50 mul[k+1]=1;51

for(int i=k;i>=1;--i) mul[i]=mul[i+1]*(num[i]+1

);52 dfs(1,0

);53 printf("

%lld\n

",ans);54}

5556

return0;

57 }

2.傳送門:牛客14132-貝倫卡斯泰露

題意:問是否可以將乙個陣列變成成兩個完全相同的陣列(元素必須從子串行選)

題解:可以直接暴搜,a[ne]表示的是我當前要新增給a1或a2的值,假如它等於a1,那麼就給a2,否則給a1(即a2放不放數永遠看a1),假如a1或a2的長度》n/2,就說明這種方案不行,回溯.因為無論如何第乙個數一定給a1,所以直接dfs(1,0,2);

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 

11 #include 12 #include 13

#define ll long long

14#define fi first

15#define se second

16#define pb push_back

17#define me memset

18const

int n = 1e6 + 10;19

const

int mod = 1e9 + 7;20

using

namespace

std;

21 typedef pairpii;

22 typedef pairpll;

2324

intt;

25int

n,a[n];

26int

a1[n],a2[n];

2728

bool dfs(int p1,int p2,int

ne)35 a1[p1+1]=a[ne];

36return dfs(p1+1,p2,ne+1

);37}38

39int

main()

5152

return0;

53 }

兩道baidu試題

1 簡述 n個空間,存放a到a n 1的數,位置隨機且數字不重,a為正且未知,現在第乙個空間的數被誤設定為 1。說明 已經知道被修改的數不是最小的。例子 n 6,a 2,原始的串為5,3,7,6,2,4。現在被別人修改為 1,3,7,6,2,4。現在希望找到5。思路 充分利用等差數列性質。法一 開一...

兩道筆試題

昨天一朋友找工作,碰到兩道演算法筆試題,都是當於鍊錶操作的.原題具體的還原不過來了,不過大致是 1.有一單鏈表,找出最後第m個節點.昨天看到問題時,想到了小學應用題 汽車過山洞,假如這個汽車開著開著,等到車頭剛要出山洞,車尾離山洞出口也有一段距離嘛.這樣,這個題方法出來了 cpp node find...

暴力解題兩道

求 n n n 的位數。n nn 不大於 1e7。解 1 將 1,n 1,n 1,n 中的整數逐個相乘。每當中間結果大於10時,不斷地將中間結果除以10並記下除以10的次數。保證中間結果小於10即可。最蠢最暴力的辦法。考慮到 n 最大為 1e7 應該用 int64來儲存中間結果。時間複雜度為o nl...