Colorful Hats 2(思维)

原题链接

题目描述

在这里插入图片描述

数据范围

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例1

6
0 1 2 3 4 5

输出样例1

3

样例1解释

在这里插入图片描述

输入样例2

3
0 0 0

输出样例2

6

输入样例3

54
0 0 1 0 1 2 1 2 3 2 3 3 4 4 5 4 6 5 7 8 5 6 6 7 7 8 8 9 9 10 10 11 9 12 10 13 14 11 11 12 12 13 13 14 14 15 15 15 16 16 16 17 17 17

输出样例3

115295190

题目大意: N 个人站成一列,每个人都戴着一顶帽子,颜色为红、黄、绿的一种。第 i 个人前面有 ai​ 个人戴着和他颜色相同的帽子。求出 N 个人帽子颜色的所有组合方案。

由题意可得,每种颜色的前置相同颜色数目一定是逐渐增大的,即对于在 ai 位置上的某个数字 n ,一定可以在其之前找到 0 ~ n - 1 。而由于本题需要考虑到所有的组合方案,因此对于 n ,若其之前存在多个尚未被匹配的 n - 1,则可以存在多种方案。例如序列: 0 0 1 1 2,对于第一个 1 ,可以与前两个 0 进行任意匹配,由此方案数 * 2,而对于第二个 1 ,因为之前的其中一个 0 已经被匹配,该 1 对应的匹配方案就是固定的;而对于序列中的 2 同理,存在两个可配对的 1 因此方案数 * 2 。

参考代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
const int N=1e6+10;
int a[N];
ll m[3];

int main(){
    
    
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    
    ll ans=1;
    for(int i=1;i<=n;i++){
    
    
        ll cnt=0;
        int x;
        if(a[i]==m[0]) {
    
    cnt++;x = 0;}
        if(a[i]==m[1]) {
    
    cnt++;x = 1;}
        if(a[i]==m[2]) {
    
    cnt++;x = 2;}
        ans*=cnt;
        ans%=mod;
        m[x]++;
    }
    cout<<ans<<endl;
}

猜你喜欢

转载自blog.csdn.net/laysan/article/details/120220582