藍橋杯 演算法訓練 未名湖邊的煩惱

2021-10-04 01:35:57 字數 1766 閱讀 7430

問題描述

每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。

每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。(兩個同樣需求的人(比如都是租鞋或都是還鞋)交換位置是同一種排法)

輸入格式

兩個整數,表示m和n

輸出格式

乙個整數,表示隊伍的排法的方案數。

思路

直接暴力窮舉,通過遞迴將長度為m+n的由0和1組成的序列全部窮舉出來,然後判斷序列是否符合題目要求。

**

#include

int length;

int ans;

int m;

int n;

void

check

(int arr)

if(arr[i]==1

)if(flag<0)

return;}

//printf("\n");

if(nn==n&&mm==m)ans++;}

void

dfs(

int arr,

int depth)

if(depth!=0)

arr[depth]=1

;dfs

(arr,depth+1)

;//return;

}int

main()

測試結果及分析

該題的測試用例資料較小,用暴力法可以通過所有測試用例。暴力法是沒有辦法的辦法,但還是要找尋最優解的。

思路

遞迴的核心思路:通過遞迴減小問題的規模。

我們記有m個還鞋子和n個租鞋子的人時的結果為fun(m,n),那麼fun(m-1,n)表示有m-1個人還鞋子和n個人租鞋子,fun(m,n-1)表示的是m個人還鞋子,n個人租鞋子。

得到遞推關係式:fun(m,n)=fun(m-1,n)+fun(m,n-1)

跳出遞迴的條件:1.m#include

intfun

(int m,

int n)

if(n==0)

return

fun(m,n-1)

+fun

(m-1

,n);

}int

main()

測試結果及分析

採用正常遞迴的方法,也通過了全部的測試用例。

這個方法的思路理解起來比較費勁。從我自己的理解來看,fun(m,n)代表乙個集合,集合裡面包含了多種排列,而排列的最後一位可能是0,也可能是1。若最後一位為0,則前面的排列情況為fun(m,n-1)。若最後一位為1,則前面的排列情況為fun(m-1,n)。這樣fun(m,n-1)+fun(m-1,n)就包含了fun(m,n)的所有可能解。

學習的路,任重而道遠。

希望我的部落格能對您有所幫助,同時歡迎演算法相關的討論與交流

藍橋杯 未名湖邊的煩惱 演算法訓練

問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...

藍橋杯 演算法訓練 未名湖邊的煩惱

問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...

未名湖邊的煩惱 藍橋杯演算法訓練題

問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...