noip 1995 灯的排列问题 排列组合 DFS
题目描述
设在一排上有N个格子(N≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N1,N2,……Nk(k表示不同颜色灯的个数)。
放灯时要遵守下列规则:
①同一种颜色的灯不能分开;
②不同颜色的灯之间至少要有一个空位置。
例如:N=8(格子数)
R=2(红灯数)
B=3(蓝灯数)
放置的方法有:
R-B顺序
R |
R |
B |
B |
B |
|||
R |
R |
B |
B |
B |
|||
R |
R |
B |
B |
B |
|||
R |
R |
B |
B |
B |
|||
R |
R |
B |
B |
B |
|||
R |
R |
B |
B |
B |
B-R顺序
B |
B |
B |
R |
R |
|||
B |
B |
B |
R |
R |
|||
B |
B |
B |
R |
R |
|||
B |
B |
B |
R |
R |
|||
B |
B |
B |
R |
R |
|||
B |
B |
B |
R |
R |
放置的总数为12种。
程序要求:求排列总数。
输入格式
数据输入的方式为:
N
P1(颜色,为一个字母) N1(灯的数量)
P2 N2
……
Q(结束标记,Q本身不是灯的颜色)
颜色和灯的数量之间由一个空格分隔。
输出
输出排列总数。
样例输入
8
R 2
B 3
Q
样例输出
12
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
struct color{
char aa;
int bb;
}q[];
struct node
{
char x;
int y;
}miss[];
int num=,s;
int sss=;
vector<int> qq[];
vector<int> m;
int kiss=;
void dfs(int a,int b,int c)
{
if(a==num&&b==s)
{
sss++;
//cout<<m.size()<<endl;
for(int i=;i<m.size();i++)
{
qq[kiss].push_back(m[i]);
}
kiss++;
for(int i=;i<m.size();i++)
{
cout<<qq[kiss-][i];
}
cout<<endl;
return;
}
if(b>s)
return;
if(c!=)
{
m.push_back();
dfs(a+,b+q[a].bb,);
m.pop_back();
}
m.push_back();
dfs(a,b+,);
m.pop_back(); }
int main()
{
kiss=;
int i,j;
int sum;
int ss=;
char a;
int b;
scanf("%d",&s);
int pp=;
while(cin>>a&&a!='Q')
{
miss[pp].x=a;
scanf("%d",&b);
miss[pp++].y=b;
ss=ss+b;
int t=;
for(i=;i<num;i++)
{
if(q[i].aa==a)
{
q[i].bb+=b;
t=;
}
}
if(t==)
{
q[num].aa=a;
q[num++].bb=b;
}
}
int per=;
for(i=;i<=num;i++)
per=per*i;
if(s-ss-num+<=)
cout<<<<endl;
else
{
dfs(,,);
/*
cout<<"1"<<endl;
for(int i=0;i<pp;i++)
cout<<miss[i].x<<" "<<miss[i].y<<endl;
*/
int a[];
for(int ii=;ii<kiss;ii++)
{
for(int i=;i<pp;i++)
a[i]=i;
int flag=;
for(int i=;i<qq[ii].size();i++)
{
//cout<<"1";
if(qq[ii][i]==)
cout<<" ";
else
{
for(int j=;j<miss[a[flag]].y;j++)
cout<<miss[a[flag]].x;
flag++;
}
}
cout<<endl; while(next_permutation(a,a+pp))
{
flag=;
for(int i=;i<qq[ii].size();i++)
{
if(qq[ii][i]==)
cout<<" ";
else
{
for(int j=;j<miss[a[flag]].y;j++)
cout<<miss[a[flag]].x;
flag++;
}
}
cout<<endl;
}
}
cout<<sss*per<<endl;
}
return ;
}
noip 1995 灯的排列问题 排列组合 DFS的更多相关文章
- Bzoj 4517: [Sdoi2016]排列计数(排列组合)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MB Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ...
- C语言 · 排列数 · 排列式
蓝桥练习场上不断碰到类似的题,都是一个递归搜索的套路. 算法提高 排列数 时间限制:1.0s 内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下 ...
- 蓝桥杯--算法提高 排列数 (简单dfs)
算法提高 排列数 时间限制:1.0s 内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...
- nyoj--19--擅长排列的小明(dfs)
擅长排列的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难 ...
- P1880 NOIP 1995石子合并
复习(du) 这道题,发现思想真不错 当时背板子打下来的 要下晚自习了,明天更注释吧 #include<iostream> #include<queue> #include&l ...
- 砝码组合(dfs)
砝码组合 题目内容:用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两 ...
- 51nod 1268 和为K的组合 dfs
题目: 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K.如果可以,输出:& ...
- hdu 1258 从n个数中找和为t的组合 (DFS)
题意:首先给你一个t,然后是n,后面输入n个数,然后让你求的是n个数中和为t的序列总共有多少种,把他们按从左到右的顺序输出来. Sample Input4 6 4 3 2 2 1 15 3 2 1 1 ...
- 【noip模拟赛4】Matrix67的派对 dfs
描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上.Matrix67的安排原则是,圆桌 ...
随机推荐
- ispoweroftwo 判断2的次幂
首先结果是: public bool IsPowerOfTwo(int n) { if(n<1) return false;//2的次幂一定大于0 return ((n & (n -1) ...
- NuGet套件还原步骤(以vs2012为例)
下载别人的范例,出现由于Nuget套件不存在而无法启动时: 效果如下图: 步骤如下: 1.点击 项目->启用NuGet程序包还原 2.点击下图中的是 3.点击下图中的确定 4.效果如图: . 5 ...
- 表格中border-collapse属性
页面制作中最头痛的,表格的边框算是其一了.一不小心就会出现双重线 border-collapse属性 很好的解决了纠结了很久的问题 .table{border: 1px solid #ccc;bord ...
- tensorflow高级库
1.tf.app.flags tf定义了tf.app.flags,用于支持接受命令行传递参数,相当于接受argv.tf.app.flags.DEFINE_xxx()就是添加命令行的optional a ...
- sql查询与修改数据库逻辑文件名,移动数据库存储路径
USE mydb GO --1.查询当前数据库的逻辑文件名 ) ) AS 'File Name 2'; --或通过以下语句查询: --SELECT name FROM sys.database_fil ...
- MySQL学习笔记:字符串前后补全0
遇到一个需求:不足6位的需要自动补全6位,使用函数LPAD()和RPAD()补全. LPAD(str, len, padstr) 用字符串padstr对str进行左边填充补全直至它的长度达到len个字 ...
- Codeforces Round #207 (Div. 1) D - Bags and Coins 构造 + bitset优化dp + 分段查找优化空间
D - Bags and Coins 思路:我们可以这样构造,最大的那个肯定是作为以一个树根,所以我们只要找到一个序列a1 + a2 + a3 .... + ak 并且ak为 所有点中最大的那个,那么 ...
- vwware虚拟机无法连接外网
1.问题:动态IP时连接外网没有问题,但是将IP改为静态IP时发现没有办法连接外网 查看文件/etc/resolv.conf,里面的内容全部都被注释 [root@jenkins network-scr ...
- C# 操作 access 数据库
随笔: (1) 命名空间 using System.Data.OleDb; (2) 连接字符串 private staticstring connStr = @"Provider= ...
- Python实现QQ自动点赞
用Python做一个QQ自动点赞神器,上代码: 1 def QQZan(qq): 2 browser = webdriver.Chrome() 3 browser.maximize_window() ...