Logo Wy Online Judge

WyOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#293#6. 「WyOJ Round 1」持 · 山海为肩recall104665ms14572kbC++144.3kb2025-04-18 16:52:262025-04-18 18:04:53

answer

#include <bits/stdc++.h>

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
// using i128 = __int128;
// using u128 = unsigned __int128;

const int N = 1e5 + 5, M = 805;

int n, m;

double p[N], p1[M][25], p2[M][25], p3[M][25];

int a[N][25];

std::string name[3] = {"rock", "paper", "scissors"};

int win[3][3] = {
    {0, -1, 1}, 
    {1, 0, -1},
    {-1, 1, 0}
};

inline int qpow(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) (res *= a);
        (a *= a);
        b >>= 1;
    }
    return res;
}

inline std::vector<int> rebuild(int S, int mm = -1) {
    std::vector<int> nw;
    while (S || nw.size() < mm) {
        nw.push_back(S % 3);
        S /= 3;
    }
    std::reverse(nw.begin(), nw.end());
    return nw;
}

const double eps = 1e-6;

int main() {
    std::ios::sync_with_stdio(0);
    std::cin.tie(0), std::cout.tie(0);

    std::cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        std::cin >> p[i];
        std::string s;
        for (int j = 0; j < m; j++) {
            std::cin >> s;
            if (s == "rock") {
                a[i][j] = 0;
            } else if (s == "paper") {
                a[i][j] = 1;
            } else {
                a[i][j] = 2;
            }
        }
    }

    int m1 = m / 3, m2 = m / 3, m3 = m / 3;
    if (m % 3 == 2) {
        m2++, m3++;
    } else if (m % 3 == 1) {
        m3++;
    }

    int up1 = qpow(3, m1), up2 = qpow(3, m2), up3 = qpow(3, m2);

    for (int i = 0; i < up1; i++) {
        auto now = rebuild(i, m1);
        for (int j = 1; j <= n; j++) {
            int c = 0;
            for (int k = 0; k < m1; k++) {
                c += win[now[k]][a[j][k]];
            }
            p1[i][c + m1] += p[j];
        }
    }
    for (int i = 0; i < up2; i++) {
        auto now = rebuild(i, m2);
        for (int j = 1; j <= n; j++) {
            int c = 0;
            for (int k = 0, kk = m1; k < m2; k++, kk++) {
                c += win[now[k]][a[j][kk]];
            }
            p2[i][c + m2] += p[j];
        }
    }
    for (int i = 0; i < up3; i++) {
        auto now = rebuild(i, m3);
        for (int j = 1; j <= n; j++) {
            int c = 0;
            for (int k = 0, kk = m1 + m2; k < m3; k++, kk++) {
                c += win[now[k]][a[j][kk]];
            }
            p3[i][c + m3] += p[j];
        }
    }

    double ans = 0;

    int a1 = 0, a2 = 0, a3 = 0, s1 = 0, s2 = 0, s3 = 0;

    for (int i = 0; i < up1; i++) {
        for (int j = 0; j < up2; j++) {
            for (int k = 0; k < up3; k++) {
                double pp = 0;
                for (int w1 = 0; w1 <= 2 * m1; w1++) {
                    for (int w2 = 0; w2 <= 2 * m2; w2++) {
                        for (int w3 = 0; w3 <= 2 * m3; w3++) {
                            if (w1 + w2 + w3 >= m) {
                                pp += p1[i][w1] * p2[j][w2] * p3[k][w3];
                                // if(i == 0 && j == 0 && k == 0) {
                                //     std::cerr << "HI: " << w1 << ' ' << w2 << ' ' << w3 << '\n' << p1[i][w1] << ' '<< p2[j][w2] << ' ' << p3[k][w3] << "\ned\n";
                                // }
                            }
                        }
                    }
                }
                if (pp - ans > eps) {
                    ans = pp;
                    a1 = i, a2 = j, a3 = k;
                    // std::cerr << pp << ' ' << ans << ' ' << i << ' ' << j << ' ' << k << '\n';
                } else if (abs(pp - ans) <= eps) {
                    if (a1 > i) {
                        a1 = i, a2 = j, a3 = k;
                    } else if (a1 == i && a2 > j) {
                        a1 = i, a2 = j, a3 = k;
                    } else if (a1 == i && a2 == j && a3 > k) {
                        a1 = i, a2 = j, a3 = k;
                    }
                }
            }
        }
    }

    std::cout << std::fixed << std::setprecision(6) << ans << "\n";

    auto tp = rebuild(a1, m1);
    for (auto v : tp) {
        std::cout << name[v] << ' ';
    }
    tp = rebuild(a2, m2);
    for (auto v : tp) {
        std::cout << name[v] << ' ';
    }
    tp = rebuild(a3, m3);
    for (auto v : tp) {
        std::cout << name[v] << ' ';
    }

    return 0;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 3692kb

input:

841 5
0.002262 paper rock rock scissors scissors
0.000665 rock paper paper scissors paper
0.001132 s...

output:

0.667739
paper paper rock rock paper 

result:

wrong answer 1st words differ - expected: '0.689135', found: '0.667739'

Test #2:

score: 10
Accepted
time: 1ms
memory: 3748kb

input:

320 1
0.001734 rock
0.000432 rock
0.003306 scissors
0.000322 paper
0.000380 rock
0.000817 scissors
0...

output:

0.728099
rock 

result:

ok 2 tokens

Test #3:

score: 0
Wrong Answer
time: 2ms
memory: 3576kb

input:

19 2
0.086520 scissors rock
0.028985 rock rock
0.056406 rock scissors
0.010732 scissors rock
0.04471...

output:

0.807831
scissors rock 

result:

wrong answer 1st words differ - expected: '0.836348', found: '0.807831'

Test #4:

score: 0
Wrong Answer
time: 952ms
memory: 14496kb

input:

100000 12
0.000008 rock rock rock scissors paper scissors paper paper paper scissors paper scissors
...

output:

0.575711
rock rock rock paper scissors scissors scissors paper scissors rock scissors rock 

result:

wrong answer 1st words differ - expected: '0.578764', found: '0.575711'

Test #5:

score: 0
Wrong Answer
time: 455ms
memory: 14264kb

input:

82918 11
0.000009 paper rock rock scissors scissors paper rock paper rock rock paper
0.000000 scisso...

output:

0.580744
paper rock paper paper paper rock rock rock scissors scissors rock 

result:

wrong answer 1st words differ - expected: '0.582727', found: '0.580744'

Test #6:

score: 0
Wrong Answer
time: 179ms
memory: 12072kb

input:

63157 10
0.000004 rock scissors paper scissors paper scissors rock paper rock scissors
0.000007 rock...

output:

0.584125
rock scissors rock paper rock paper rock scissors rock paper 

result:

wrong answer 1st words differ - expected: '0.587712', found: '0.584125'

Test #7:

score: 0
Wrong Answer
time: 976ms
memory: 14572kb

input:

100000 12
0.000003 rock rock rock paper paper rock paper paper paper rock rock scissors
0.000001 pap...

output:

0.576113
paper rock paper rock paper scissors rock scissors scissors scissors scissors paper 

result:

wrong answer 1st words differ - expected: '0.578665', found: '0.576113'

Test #8:

score: 0
Wrong Answer
time: 417ms
memory: 11572kb

input:

72055 11
0.000006 rock scissors scissors rock scissors scissors scissors scissors rock scissors scis...

output:

0.580921
scissors rock paper rock rock rock paper rock scissors rock scissors 

result:

wrong answer 1st words differ - expected: '0.584229', found: '0.580921'

Test #9:

score: 0
Wrong Answer
time: 724ms
memory: 9252kb

input:

49463 12
0.000024 rock paper scissors paper rock scissors rock paper paper paper paper paper
0.00000...

output:

0.580836
rock paper rock scissors paper scissors rock scissors paper paper rock paper 

result:

wrong answer 1st words differ - expected: '0.584658', found: '0.580836'

Test #10:

score: 0
Wrong Answer
time: 956ms
memory: 14236kb

input:

100000 12
0.000007 rock paper scissors paper paper scissors rock rock scissors rock scissors paper
0...

output:

0.574633
rock paper paper rock paper paper scissors paper scissors rock paper rock 

result:

wrong answer 1st words differ - expected: '0.578092', found: '0.574633'