Codeforces Round #444 (Div. 2) B. Cubes for Masha 暴力、枚举

ProLightsfx 2018-1-14 161 1/14
B. Cubes for Masha 暴力、枚举

My Solution

题意:有n(1<= n <= 3)个骰子(每面标着数字0~9),要求找出最大的数x,满足1~x之间所有的数都可以用这最多n个骰子的正面表示出来。不能旋转,即不能用9表示6,反正亦然,且不要求所有的骰子都用上)。

暴力、枚举

首先用一个标记数组f,先全标记为false,之后把出现过的数都标记为true。

当n == 1的时候,只有枚举每一面,并标记即可。

当n == 2的时候,要枚举只用到1个骰子的情况和要用到2个骰子的情况,同时手动枚举全排列。

当n == 3的时候,要枚举只用到1个或者2个骰子的情况和要用到3个骰子的情况,同时手动枚举全排列

详情请见代码。

时间复杂度 O(1000)

空间复杂度 O(1000)

#include 
#include 
#include 
using namespace std;
typedef long long LL;
const int MAXN = 1e3 + 8;

bool f[MAXN];
int v[6][6];

int main()
{
    #ifdef LOCAL
    freopen("b.txt", "r", stdin);
    //freopen("b.out", "w", stdout);
    int T = 4;
    while(T--){
    #endif // LOCAL
    ios::sync_with_stdio(false); cin.tie(0);

    int n, i, j, k, ans = 0;
    cin >> n;
    for(i = 0; i < n; i++){
        for(j = 0; j < 6; j++){ cin >> v[i][j];
        }
    }
    if(n == 1){
        for(j = 0; j < 6; j++){
            f[v[0][j]] = true;
        }
    }
    else if(n == 2){
        for(j = 0; j < 6; j++){
            f[v[0][j]] = true;
        }
        for(j = 0; j < 6; j++){
            f[v[1][j]] = true;
        }
        for(i = 0; i < 6; i++){
            for(j = 0; j < 6; j++){
                f[v[0][i]*10 + v[1][j]] = true;
                f[v[1][i]*10 + v[0][j]] = true;
            }
        }

    }
    else{
        for(j = 0; j < 6; j++){
            f[v[0][j]] = true;
        }
        for(j = 0; j < 6; j++){
            f[v[1][j]] = true;
        }
        for(j = 0; j < 6; j++){
            f[v[2][j]] = true;
        }
        for(i = 0; i < 6; i++){
            for(j = 0; j < 6; j++){
                for(k = 0; k < 6; k++){
                    f[v[0][i]*100 + v[1][j]*10 + v[2][k]] = true;
                    f[v[1][i]*100 + v[0][j]*10 + v[2][k]] = true;

                    f[v[0][i]*100 + v[2][j]*10 + v[1][k]] = true;
                    f[v[2][i]*100 + v[0][j]*10 + v[1][k]] = true;

                    f[v[2][i]*100 + v[1][j]*10 + v[0][k]] = true;
                    f[v[1][i]*100 + v[2][j]*10 + v[0][k]] = true;
                }
            }
        }
        for(i = 0; i < 6; i++){
            for(j = 0; j < 6; j++){
                f[v[0][i]*10 + v[1][j]] = true;
                f[v[1][i]*10 + v[0][j]] = true;

                f[v[0][i]*10 + v[2][j]] = true;
                f[v[2][i]*10 + v[0][j]] = true;

                f[v[2][i]*10 + v[1][j]] = true;
                f[v[1][i]*10 + v[2][j]] = true;
            }
        }

    }
    for(i = 1; i < MAXN; i++){
        if(!f[i]){
            break;
        }
        ans = i;
    }
    cout << ans << endl;


    #ifdef LOCAL
    memset(f, false, sizeof f);
    cout << endl;
    }
    #endif // LOCAL
    return 0;
}

 

 

Thank you!

                                                                                                                                             ------from ProLightsfx

 

- THE END -

ProLightsfx

11月17日01:15

最后修改:2024年11月17日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论