時間限制:1000ms 記憶體限制:65535k
提交次數:0 通過次數:0
題型: 程式設計題 語言: g++;gcc;vc
某理工學校a班全為男生,另有某師範學校b班全為女生。一次,兩個班組織了一次聯誼活動,**電影《美人魚》,訂完票發現所有位置為同一排且從1到t號(t為人的總數),為了讓參加活動的每乙個女生都有機會同
男生有對話的機會,組織者在安排座位時,讓女生左或右,至少有乙個男生。現在告訴你男生人數n,女生
人數m,問一共有多少種不同的座位安排方法。
每一行乙個數w(w<=100),為case數量此後w行,每行兩個數n和m
每個case輸出乙個結果(使用long long)
73 03 1
0 11 1
2 22 3
2 4
62402163648
注意:男生旁邊可以沒有女生
admin
scau-排排坐看電影—遞迴。 有n個男生和m個女生,要求每個女生左邊或右邊至少有乙個男生,而男生的位置則沒有要求。利用遞推的思想。假設下,按題目要求放置n個男生和m個女生的方法種數為recur(n,m); 一開始在一排位置的最邊上,這個位置既可放男生又可放女生;如果放了男生,因為剩餘有n個男生還未放置,所以會有n*recur(n-1,m)種的放法; 如果放了女生,同理,就是m*recur(n,m-1)種放法。 然後進入下一層遞迴,直至女生和男生都放完了或者遇到男生放完了但女生還有剩餘數的無法進行下去的情況。
那麼,要如何判斷當前的這個位置是否可以放女生或者男生女生皆可呢? 我的做法是在遞迴函式recur()裡加多了兩個引數:recur(n,m,p,pp); 其中p用來標記當前位置的前乙個位置是女生還是男生;而pp就是用來標記 '前乙個位置' 的前乙個位置是男生還是女生;這樣一來在函式裡根據這兩個引數就可以判定當前位置該如何放置了。 另外要注意的是函式遞迴的終止條件。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include9 #include 10 #include 11 #include 12 #include 13 #include 14
#define ll long long
15#define inf 0x3f3f3f3f
16#define male 1 //
用來標記男生和女生的常量
17#define female 0
18using
namespace
std;
1920
int a(int n) //
計算n的階乘
2127 ll recur(ll n,ll m,int p,int
pp)2840}
41else
if(n>0) //
如果女生沒了,那剩下的n個男生可以形成n!種放法。
4245
else
if(m>0) //
如果在考慮當前位置的時候已經是只剩女生了
4652
else
if(!n&&!m) //
所有人都放置完畢
53return1;
5455}56
intmain()
5771 ans=n*recur(n-1,m,male,-1)+m*recur(n,m-1,female,-1
);72 printf("
%lld\n
",ans);73}
74return0;
75 }
18121 排排坐看電影
時間限制 1000ms 記憶體限制 65535k 提交次數 0 通過次數 0 題型 程式設計題 語言 g gcc vc 某理工學校a班全為男生,另有某師範學校b班全為女生。一次,兩個班組織了一次聯誼活動,電影 美人魚 訂完票發現所有位置為同一排且從1到t號 t為人的總數 為了讓參加活動的每乙個女生都...
快排和堆排
一 快速排序 最常用的排序演算法,速度通常也是最快的。時間複雜度 o nlogn 最壞 o n 2 空間複雜度 o nlgn 不穩定 比如 5 3 3 4 3 8 9 10 11 這個序列,在中樞元素5和3交換就會把元素3的穩定性打亂 實現原理 快排主要是通過選擇乙個關鍵值作為基準值。比基準值小的都...
快排 歸併 堆排
快排 include include include includeusing namespace std void quicksort vector a,int l,int r 終止遞迴的條件,子串行長度為1 int mid low high low 2 取得序列中間的元素 mergesort a...