18121 排排坐看电影

Description

某理工学校A班全为男生,另有某师范学校B班全为女生。一次,两个班组织了一次联谊活动,观看电影
《美人鱼》,订完票发现所有位置为同一排且从1到T号(T为人的总数),为了让参加活动的每一个女生都有机会同
男生有对话的机会,组织者在安排座位时,让女生左或右,至少有一个男生。现在告诉你男生人数n,女生
人数m,问一共有多少种不同的座位安排方法。



输入格式

每一行一个数W(W<=100),为case数量
此后W行,每行两个数n和m


输出格式

每个case输出一个结果(使用long long)


输入样例

7
3 0
3 1
0 1
1 1
2 2
2 3
2 4


输出样例

6
24
0
2
16
36
48


提示

注意:男生旁边可以没有女生
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>


using namespace std;
       // 用递归的方法去排列   排 第 n位的时候 只需要考虑前面两个  p(n-2)位 和 pp(n-1)位
       //当前位置 的男女 只要让pp位 符合要求即可;故需要看 pp 和p 来判断当前可放男或女生
long long get_times(int M,int W,int cur,bool p,bool pp,int n)
{
    if(cur==n)  { if(W==1&&pp==1) return 0;else return 1; }              //对于最后一个人排序  如果最后一个为女生 要考虑 自身不一定符合题意
    long long times=0;
    if(pp==0||pp==1&&p==0)               //pp 为男 或者 pp位女且p为男时
    {
       if(M!=0) times+=M*get_times(M-1,W,cur+1,pp,0,n);                //当还有剩余男生时 可以放一个男生
        if(W!=0) times+=W*get_times(M,W-1,cur+1,pp,1,n);              //当还有剩余女生时  可以放一个女生
    }
    if(pp==1&&p==1)        if(M!=0) times+=M*get_times(M-1,W,cur+1,0,0,n);            //当 pp 和p都为女生时  当前只可以放 男生 来使pp 有效
    return times;
}


long long solve(int M,int W,int n)
{
    if(M==0||n==1&&W==1) return 0;              //没有男生 和 只有一个女生
    if(M==1&&n==1)  return 1;                       //只有一个男生
    long long times=0;
      times+=M*get_times(M-1,W,2,0,0,n)  ;   // 第一个是男生时 排列剩余人
     if(W>0) times+=W*get_times(M,W-1,2,1,1,n) ;//第一个是女生时 排列剩余人
     return times;
}


int main()
{
    int  n_case;
    cin>>n_case;       //n case 事件
    int  M,W;
    for(int i=0;i<n_case;i++)
    {
         cin>>M>>W;      //M  男生   W 女生
         cout<<solve( M, W, M+W)<<endl;      //输出 符合题意 的个数
    }
}



 
 
 
 
 
 

                
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值