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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值