2313 - 灯的排列问题

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 125 MB

设在一排上有N个格子(N20),若在格子中放置有不同颜色的灯,每种灯的个数记为N1N2,……Nkk表示不同颜色灯的个数)。

   放灯时要遵守下列规则:

同一种颜色的灯不能分开;

不同颜色的灯之间至少要有一个空位置。

   例如: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

C++解答

#include<iostream>

using namespace std;

int main()

{      

        char x;

        int k=0,t,n,ans=1,i;

        cin>>n;

        while(1)

        {cin>>x;

         if(x=='Q')break;

         cin>>t;

         k++;

         n-=t;

        }

        ans=1;

        for(i=-1;i<k-1;i++)  ans*=(n-i);

        cout<<ans;

}

Python解答

# coding=utf-8
def main():
    N = int(input())
    C = []
    while True:
        temp = input()
        if temp == 'Q':
            break
        else:
            C.append(int(temp.split()[1]))

    N_color = len(C)
    N_space = N - sum(C)

    cnt_color = 1
    for i in range(1, N_color+1):
        cnt_color *= i
    
    cnt_space = 1 
    nn = N_space - N_color + 1 
    for i in range(nn):
        cnt_space *= N_space + 1 - i
    for i in range(1, nn + 1):
        cnt_space /= i

    print(int(cnt_color*cnt_space))
    

if __name__ == '__main__':
    main()