NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推 ||卡特兰数(转化成01字符串))
Description
今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑。不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m。但是大家来的时间不同,随机次序来机房,带电脑的人直接准备比赛而没带电脑的人需要向带电脑并还没和别人公用的人求助(当然会答应)。但是,如果不存在带电脑并还没和别人公用的人,那他就要等了,等是很让人头疼的,这就不和谐了,当然假如没有这样的情况发生比赛是很和谐的。
Input
输入多组数据,每组数据只有一行m(1<=m<=n<=20)和n(1<=n<=20);
Output
输出和谐比赛的场数。
Sample Input
1 2
3 8
4 17
Sample Output
2
110
4655
这道题可以看成是递推,也可以用组合数学来解,具体就是卡特兰数。
我们把没带电脑的看成0,带电脑的看成1,那么问题就转化成从左向右扫描0的个数不超过1的个数
假设某一位0之前0的累计数等于1的累计数,假设之前有m个1,m个0,
这个0是第2m+1位,之后有2n-m个1和2n-m-1个0,要出现0的累计数大于1的累计个数这种情形,我们可以增加0的个数,
类似于DP那种可以转化问题的思想,但是怎么转化成我们要求解的问题呢?
我们可以将2n-m个1变成0,将2n-m-1个0变成1,转化后就会出现0的累计数大于1的累计个数这种情形。
答案就是卡特兰数c(q,p+q)-c(q+1,p+q);q代表0的个数。
类似于这种转化成01形式求解的还有:
给定一个4*3的棋盘,从左下角到右上角,每次只能向右走或者向上走,有多少种方案?
我们发现要从左下角到右上角只要向右走四步,向上走三步,用1代表向上走,用0代表向右走,那么问题就转化成由4个0和3个1组成的
7位01字符串,这两种形式一一对应,答案就是c(4,7).
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <string>
#define LL long long using namespace std; int p, q;
LL f[][]; void Init()
{
memset(f, , sizeof(f));
for (int i = ; i <= ; ++i)
{
f[i][] = ;
}
for (int i = ; i <= ; ++i)
{
for (int j = ; j <= ; ++j)
if(i<j)
f[i][j]=;
else
f[i][j] = f[i-][j] + f[i][j-];
}
}
LL c[][];
void slove()
{
memset(c,,sizeof(c));
for(int i=;i<=;i++)
{
c[][i]=;
c[][i]=i;
c[i][i]=;
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
c[j][i]=c[j][i-]+c[j-][i-];
}
double C(int m,int n)
{
double answer1=,answer2=;
for(int i=n-m+;i<=n;i++)
answer1*=i;
for(int i=;i<=m;i++)
answer2*=i;
return answer1/answer2;
}
int main()
{
//freopen("test.in", "r", stdin);
slove();
while (scanf("%d%d", &p,&q) != EOF)
{
printf("%lld\n",c[q][p+q]-c[q+][p+q] );
printf("%.0lf\n",C(q,p+q)-C(q+,p+q) );
Init();
printf("%lld\n", f[q][p]);
}
return ;
}
NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推 ||卡特兰数(转化成01字符串))的更多相关文章
- ACM学习历程—NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推)
Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m. ...
- ACM学习历程—NPU1086 随机数 2015年陕西省程序设计竞赛网络预赛(正式赛)C题 (计数排序 || set容器)
Description 开学了,ACM队的边老板想在学校中请一些妹子一起做一项问卷调查,调查妹子们对ACM的了解情况,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100), ...
- ACM学习历程—NPU1045 2015年陕西省程序设计竞赛网络预赛(热身赛)C题 Graph Theory(递推 && 组合数学 && 大数)
Description In graph theory, a matching or independent edge set in a graph G = (V , E) is a set of e ...
- 2016中国大学生程序设计竞赛 - 网络选拔赛 C. Magic boy Bi Luo with his excited tree
Magic boy Bi Luo with his excited tree Problem Description Bi Luo is a magic boy, he also has a migi ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1001 - Buy and Resell 【优先队列维护最小堆+贪心】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6438 Buy and Resell Time Limit: 2000/1000 MS (Java/O ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation 【dfs+树上两点距离和】
Tree and Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 6154 - CaoHaha's staff | 2017 中国大学生程序设计竞赛 - 网络选拔赛
/* HDU 6154 - CaoHaha's staff [ 构造,贪心 ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 题意: 整点图,每条线只能连每个方格的边或者对角线 问面积大于n的 ...
- HDU 6150 - Vertex Cover | 2017 中国大学生程序设计竞赛 - 网络选拔赛
思路来自 ICPCCamp /* HDU 6150 - Vertex Cover [ 构造 ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 题意: 给了你一个贪心法找最小覆盖的算法,构造一组 ...
随机推荐
- Codevs 3409 搬礼物
时间限制: 1 s 空间限制: 64000 KB 题目等级 : 青铜 Bronze 题目描述 Description 小浣熊松松特别喜欢交朋友,今年松松生日,就有N个朋友给他送礼物.可是要把这些礼 ...
- Java有几种线程池?
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程newFixed ...
- Python基础之 一 集合(set)
集合:是一个无序的,不重复的数据组合.主要作用: 去重(把列表变成集合就自动去重) 关系测试 测试俩组数据的交集,差集,并集等关系 关系测试共有7种,如下: 名称 方法名 简写符号 解释交集 s.in ...
- SyntaxError: expected expression, got '<'异常错误
引入jQuery文件,浏览器报SyntaxError: expected expression, got '<'错误,但是jQuery文件可以在网络一栏看到,最后检查是springMVC定义的拦 ...
- WinCE5.0如何安装.NET3.5
首先去微软官网下载.NET Compact Framework 3.5 Redistributable 点击下载 下载页面 一共有两种安装方式,我们先介绍常规的安装方式 1.设备连接到电脑,然后双击下 ...
- hdoj 3351 Seinfeld 【栈的简单应用】
Seinfeld Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- gbk转utf-8 iconv 编码转换
linux以下有时候 字符须要进行编码转换(爬虫将gbk转为utf-8编码...).一般能够选择iconv函数. 终端以下 输入 man 3 iconv 得到 iconv函数的用法. 个人看习惯了 ...
- python实现接口自动化
一.总述 Postman:功能强大,界面好看响应格式自主选择,缺点支持的协议单一且不能数据分离,比较麻烦的还有不是所有的公司都能上谷歌SoupUI:支持多协议(http\soup\rest等),能实现 ...
- asp.net mvc的权限管理设计
现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理. 1 后台管理效果 (1)角色管理 (2)权限管理 2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...
- MYSQL将时间格式化
SELECT *,DATE_FORMAT(FROM_UNIXTIME(createtime), "%Y/%m/%d %H:%i:%s") AS dateFormat FROM `I ...