18121 排排坐看电影

18121 排排坐看电影

时间限制:1000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

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

提示

注意:男生旁边可以没有女生

作者

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 <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cctype>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <set>
 9 #include <map>
10 #include <queue>
11 #include <stack>
12 #include <utility>
13 #include <vector>
14 #define ll long long
15 #define inf 0x3f3f3f3f
16 #define male 1    //用来标记男生和女生的常量
17 #define female 0
18 using namespace std;
19
20 int A(int n) //计算n的阶乘
21 {
22     int ans=1;
23     for(int i=1; i<=n; i++)
24         ans*=i;
25     return ans;
26 }
27 ll recur(ll n,ll m,int p,int pp)
28 {
29     if(n>0&&m>0) //如果男生和女生都大于0
30     {
31         if(p==male) //如果当前位置的前一个人是男生,则该位置放男生或女生都可以
32             return m*recur(n,m-1,female,p)+n*recur(n-1,m,male,p);
33         else    //如果前一个位置是女生
34         {
35             if(pp==male) //且再前一个是男生,则该位置也是可以既放男生,或放女生
36                 return m*recur(n,m-1,female,p)+n*recur(n-1,m,male,p);
37             else        //当前一个和再前一个都是女生,则该位置一定要放男生; 形成‘男女女男‘的形式符合题目要求
38                 return n*recur(n-1,m,male,p);
39         }
40     }
41     else if(n>0) //如果女生没了,那剩下的n个男生可以形成n!种放法。
42     {
43         return A(n);
44     }
45     else if(m>0) //如果在考虑当前位置的时候已经是只剩女生了
46     {
47         if(p==male) //如果前一个位置为男生则在该位置放女生
48             return m*recur(n,m-1,female,p);
49         else  //如果前一个位置为女生则接下来的放置肯定是不符合题目要求的
50             return 0;
51     }
52     else if(!n&&!m) //所有人都放置完毕
53         return 1;
54
55 }
56 int main()
57 {
58     //freopen("input.txt","r",stdin);
59     int w;
60     ll n,m;
61     ll ans;
62     scanf("%d",&w);
63     while(w--)
64     {
65         scanf("%lld%lld",&n,&m);
66         if(m>(n<<1)||!n) //如果 m>2n 或者n=0,就直接输出0
67         {
68             printf("0\n");
69             continue;
70         }
71         ans=n*recur(n-1,m,male,-1)+m*recur(n,m-1,female,-1);
72         printf("%lld\n",ans);
73     }
74     return 0;
75 }
时间: 2025-01-13 20:31:20

18121 排排坐看电影的相关文章

【BZOJ2227】【ZJOI2011】看电影 [组合数学][质因数分解]

看电影 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院.但这家电影院分配座位的方式很特殊,具体方式如下: 1. 电影院的座位共有K个,并被标号为1…K,每个人买完票后会被随机指定一个座位,具体来说是从1…K中等可能的随机选取一个正整数,设其为L.

看电影《无间道》

?现象 一段剧情: 卧底警察的档案保存在电脑里,保存在黄警司的个人电脑里. 说明不是在警署的网络系统里(不在服务器上).在一个独立的系统里,没有联网的话,当然没有 密码的情况下,这样最能保证卧底的身份. 分析: 香港警署是不会给一个警司这样的权利的-----一个人说了算,说谁是卧底,谁就是. 那么,如何保证有一天,这份档案需要被公布的时候,或者是需要给卧底重新翻牌的时候,如何确 保信息是真实有效的呢? 我想这是一个有点技术含量的技术问题. 看电影<无间道>,布布扣,bubuko.com

uestc 1135 邱老师看电影

邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 一天邱老师心血来潮想去看电影,但是邱老师的妹子想去逛街,他们谁也没有办法说服对方,于是准备来玩一个游戏来决定听谁的. 邱老师找来w只白鼠和b只黑鼠,邱老师和妹子轮流从袋子里面抓老鼠,谁先抓到白色老鼠谁就赢. 但是有酱神在旁边捣乱,邱老师每抓一只老鼠出来,酱神就偷偷的也从里面抓一只出来,这3个人抓出来的老鼠都是随机的.

UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming&lt;Problem F&gt;

F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 一天邱老师心血来潮想去看电影,但是邱老师的妹子想去逛街,他们谁也没有办法说服对方,于是准备来玩一个游戏来决定听谁的. 邱老师找来w只白鼠和b只黑鼠,邱老师和妹子轮流从袋子里面抓老鼠,谁先抓到白色老鼠谁就赢. 但是有酱神在旁边捣乱,邱老师每抓一只老鼠出来,酱神就偷偷的也从里面抓一只出

开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图

先上图吧 卡卡的全是在tty1 下的操作,看电影,听歌,截图 ,看图  ,上irc 等等,相当适合在小白面前装屁! 需要安装的软件: 为了能正常显示中文:安装fbterm sudo apt-get install fbterm 因为ubuntu 14.04 的framebuffer 默认是开启的  是都开启 请查看 (ls /proc/|grep fb)所以不用做其他配置, 只要把用户加入video 组就可以了 否则会出现: "cann't open frame buffer device!&q

第一次约会看电影的细节 了解好男人的标准看他是否合格

1.由你选择看什么电影,配合你方便的时间,并且来接你,或者问你有没有时间吃晚饭,这个男生把你放在第一位,是个好男人哦!(100分) 2.先问你喜欢看什么类型的电影,然后搜索近期上映的电影,给你提供意见.这样的男生很细心,会帮你设想周到,比较尊重女生的意见.(90分以上) 咖啡厅可以说是约会圣地,不管是第一次约会,还是之后,咖啡厅都是非常值得去的地方,喝咖啡,听歌,聊聊各自的生活和理想,浪漫的感觉就这样出来了哦.电影院也是适合初次约会的好地方,挑选一部当下的非常热门的大片,挑一个情侣座,一起看电影

CDOJ 1135 邱老师看电影 概率dp

邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 一天邱老师心血来潮想去看电影,但是邱老师的妹子想去逛街,他们谁也没有办法说服对方,于是准备来玩一个游戏来决定听谁的. 邱老师找来w只白鼠和b只黑鼠,邱老师和妹子轮流从袋子里面抓老鼠,谁先抓到白色老鼠谁就赢. 但是有酱神在旁边捣乱,邱老师每抓一只老鼠出来,酱神就偷偷的也从里面抓一只出来,这3

[ZJOI2011]看电影(MOVIE)

题目描述 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院.但这家电影院分配座位的方式很特殊,具体方式如下: 电影院的座位共有K个,并被标号为1...K,每个人买完票后会被随机指定一个座位,具体来说是从1...K中等可能的随机选取一个正整数,设其为L. 如果编号L的座位是空位,则这个座位就分配给此人,否则将L加一,继续前面的步骤. 如果在第二步中不存在编号L的座位,则该人只能站着看电影,即所谓的站票.

codevs——1570 去看电影

1570 去看电影 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 农夫约翰带着他的一些奶牛去看电影.而他的卡车最多只能载重C(100<=C<=5000)公斤,总体上来说,他想在不超过限制的前提下尽可能多地带走牛. 给出N (1 <= N <= 16)头奶牛的体重W_i,计算约翰可以带去看电影的奶牛的最大重量. 输入描述 Input Description * 第 1 行: 2个用空格隔开的整数 C , N