NOIP 灯的排列问题

题目描述

设在一排上有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

注意同意颜色归到一起

暴力搜索出一种颜色顺序下的所有顺序

再将它乘上N种颜色的排列数N!

即可得到总排列数。。。。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct color{    //没必要用结构体  开始想复杂了 数组就OK
   char aa;
   int bb;
}q[10];
int num=0,s;
int sss=0;      //同意颜色顺序下排序数
void dfs(int a,int b,int c)          //a表示已用颜色  b表示已放格子数  c表示是否要放空格
{
    if(a==num&&b==s)
        {
            sss++;
            return;
        }
    if(b>s)
        return;
        if(c!=1)
    dfs(a+1,b+q[a].bb,1);
    dfs(a,b+1,0);
}
int main()
{
    int i,j;
    int sum;
    int ss=0;
    char a;
    int b;
    scanf("%d",&s);
    while(cin>>a&&a!='Q')
    {
        scanf("%d",&b);
        ss=ss+b;
        int t=0;
        for(i=0;i<num;i++)
          {
              if(q[i].aa==a)
                {
                    q[i].bb+=b;
                    t=1;
                }
          }
          if(t==0)
          {
              q[num].aa=a;
              q[num++].bb=b;
          }
    }
    int per=1;
    for(i=1;i<=num;i++)
        per=per*i;
    if(s-ss-num+1<=0)         //格子不够
        cout<<0<<endl;
    else
    {
        dfs(0,0,0);
        cout<<sss*per<<endl;
    }
    return 0;
}
时间: 2024-10-18 08:15:14

NOIP 灯的排列问题的相关文章

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

NOIP 求前序排列

题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入格式 每个测试文件只包含一组测试数据,每组输入包含两行,第一行输入一个字符串表示二叉树的中序排列,第二行输入一个字符串表示二叉树的后序排列. 输出 对于每组输入数据,输出二叉树的先序排列. 样例输入 BADC BDCA 样例输出 ABCD 通过后序排列确定最后一个节点是根节点 然后再通过中序排列找到根节点的左右 找到左子树和右子树的范围 而它们的范围又和后序排列左右子树的范围相同 再

noip模拟赛 排列

[问题描述] 给出一个随机的排列,请你计算最大值减最小值的差小于等于0~n-1的区间分别有多少个. 输入格式 输入文件名为sum.in. 第一行一个数T(<=10),表示数据组数 对于每一组数据: 第一行一个数n(1<=n<=100,000) 第二行n个数a1...an,表示一个随机的排列 [输出] 输出文件名为sum.out. 对于每组数据输出n行,分别表示差值小于等于0~n-1的区间个数 [输入输出样例] sum.in sum.out 1 4 3 2 4 1 4 5 7 10 [数据

在 WindowMobile 上的模拟LED 显示屏插件(转)

源:在 WindowMobile 上的模拟LED 显示屏插件 我在给一个对话框上的控件查找翻看合适的图标时,无形中看到了一个LED显示屏的图标,这里所说的LED显示屏是指由很多LED灯密集排列组成的点阵式LED屏,比如在股市交易所,公交车上,银行门口,我们经常能看到这样的滚动式显示屏.我不禁忽然想到,如果把它放在手机上显示,那效果是不是很别致呢?而且我在很久以前用 C# 模拟了这种LED显示屏的效果,因此技术上没有什么问题.不过现在,我想把它在手机上实现,而且我的想法是做成今日插件,因为相比普通

CF每日一题系列 —— 415A

http://codeforces.com/problemset/page/7?order=BY_SOLVED_DESC 从5000以内选的,emmm还是比较水的哈 时间还是有的,所以万事万物贵在坚持,希望能坚持下去! Describe: 1 - n个灯线性排列(初始为开),小明可以选择开关 op,这回把op - n 的灯全部关闭,如果(是关着的状态没有影响) 给你小明选择op的操作顺序,输出顺序输出每个灯是由哪个op操作关了的 Solution: 跑暴力就好了,我用了一个比较水的优化,记录当前

无缝拼接屏技术哪种好

无缝拼接屏专指可以实现0mm拼缝显示的液晶拼接大屏幕,它虽然并不是把液晶面板做成无边框的,但却是通过后期的技术手段消除拼缝对画面显示的影响,并且还保持着液晶屏高清分辨率这一优势,使整个大屏幕的显示效果得以提升.而目前可以实现无缝拼接显示效果的技术不止一种,其中应用较多的是电子无缝技术和光学无缝技术两种.那么无缝拼接屏技术哪种较好呢?一.电子无缝技术这一技术是通过改变液晶面板的结构,并对其进行技术上的升级实现,在推出成品之前,我公司研发经过了大量的试验,最终决定利用超小间距的LED灯珠排列在芯片上

codevs 1013 求先序排列 2001年NOIP全国联赛普及组 x

题目描述 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入描述 Input Description 两个字符串,分别是中序和后序(每行一个) 输出描述 Output Description 一个字符串,先序 样例输入 Sample Input BADC BDCA 样例输出 Sample Output ABCD 数据范围及提示 Data Size & Hint 分类标签 Tags 点此展开 #include<

排列组合

(常考)错位排列 有N封信和N个信封,每封信都不装在自己信封里的排列种数记作Dn,则 D1=0,D2=1,D3=2,D4=9,D5=44,D6=265 一.相邻问题---捆绑法 不邻问题---插空法 对于某几个元素不相邻的排列问题,可先将其他元素排好,再将不相邻元素在已排好的元素之间及两端空隙中插入即可. [例题1]一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添进去2个新节目,有多少种安排方法? A.20 B.12 C.6 D.4 [答案]A. [解析] 以下内容需要回复才能看

9509 开灯(dfs)

9509 开灯 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC Description 有16的开关分别控制16盏灯,开关排列成4*4的矩形,这些开关有这样的关系: 你改变其中一个开关的状态,与其同行和同列的开关的状态也跟着改变.先给出一个这些开关的初始状态,要求将所有的开关都打开,让所有的灯都亮起来,要求按下开关的次数最少. 输入格式 第一行输入一个整数t,表示有多少个case,每个case之间有一空行,每个case输入一