ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#271 | #6. 「WyOJ Round 1」持 · 山海为肩 | jxy2012 | 10 | 6215ms | 18292kb | C++23 | 3.8kb | 2025-04-18 15:11:23 | 2025-04-18 18:03:20 |
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const int N = 200005;
const int INF = 0x3f3f3f3f;
int cal(string s) {
if (s[0] == 'r') return 0;
if (s[0] == 'p') return 1;
return 2;
}
struct Node {
int id1, id2;
double p;
vector<char> vec1, vec2;
};
int D[3][3] = {{0, 0, 1}, {1, 0, 0}, {0, 1, 0}};
int main() {
int n, m;
cin >> n >> m;
int m1 = m / 2, m2 = m - m1;
vector<Node> vec;
for (int i = 0; i < n; i++) {
double p;
cin >> p;
vector<int> a(m);
for (int j = 0; j < m; j++) {
string s;
cin >> s;
a[j] = cal(s);
}
int id1 = 0, id2 = 0;
for (int j = 0; j < m1; j++) id1 = id1 * 3 + a[j];
for (int j = 0; j < m2; j++) id2 = id2 * 3 + a[m1 + j];
Node R;
R.id1 = id1;
R.id2 = id2;
R.p = p;
for (int j = 0; j < m1; j++) R.vec1.push_back(a[j]);
for (int j = 0; j < m2; j++) R.vec2.push_back(a[m1 + j]);
vec.push_back(R);
}
sort(vec.begin(), vec.end(), [&](Node x, Node y) {
if (x.id1 != y.id1) return x.id1 < y.id1;
return x.id2 < y.id2;
});
vector<Node> G;
for (int i = 0; i < n;) {
int j = i;
double sum = vec[i].p;
while (j + 1 < n && vec[j + 1].id1 == vec[i].id1 && vec[j + 1].id2 == vec[i].id2) sum += vec[++j].p;
Node R;
R.id1 = vec[i].id1;
R.id2 = vec[i].id2;
R.p = sum;
R.vec1 = vec[i].vec1;
R.vec2 = vec[i].vec2;
G.push_back(R);
i = j + 1;
}
int tr1 = 1, tr2 = 1;
for (int i = 0; i < m1; i++) tr1 *= 3;
for (int i = 0; i < m2; i++) tr2 *= 3;
vector<vector<char>> matrix1(tr1, vector<char>(m1)), matrix2(tr2, vector<char>(m2));
for (int k = 0; k < tr1; k++) {
int t = k;
for (int j = m1 - 1; j >= 0; j--) {
matrix1[k][j] = t % 3;
t /= 3;
}
}
for (int k = 0; k < tr2; k++) {
int t = k;
for (int j = m2 - 1; j >= 0; j--) {
matrix2[k][j] = t % 3;
t /= 3;
}
}
vector<vector<double>> A(tr1, vector<double>(2 * m1 + 1, 0));
for (int k1 = 0; k1 < tr1; k1++) {
for (int i = 0; i < (int)G.size(); i++) {
int sum = 0;
for (int j = 0; j < m1; j++) {
int x = matrix1[k1][j], y = G[i].vec1[j];
if (x != y) sum += D[x][y] ? +1 : -1;
}
A[k1][sum + m1] += G[i].p;
}
}
vector<vector<double>> B(tr2, vector<double>(2 * m2 + 1, 0));
vector<vector<double>> P(tr2, vector<double>(2 * m2 + 2, 0));
for (int k2 = 0; k2 < tr2; k2++) {
for (int i = 0; i < (int)G.size(); i++) {
int sum = 0;
for (int j = 0; j < m2; j++) {
int x = matrix2[k2][j], y = G[i].vec2[j];
if (x != y) sum += D[x][y] ? +1 : -1;
}
B[k2][sum + m2] += G[i].p;
}
for (int u = 2 * m2; u >= 0; u--) P[k2][u] = B[k2][u] + P[k2][u + 1];
}
double res = -1.0;
int bk1 = 0, bk2 = 0;
for (int k1 = 0; k1 < tr1; k1++) {
for (int k2 = 0; k2 < tr2; k2++) {
double val = 0;
for (int h = 0; h <= 2 * m1; h++) val += A[k1][h] * P[k2][m - h];
if (val > res + 1e-15) {
res = val;
bk1 = k1;
bk2 = k2;
}
}
}
printf("%.6lf\n", res);
string ss[3] = {"rock", "paper", "scissors"};
for (int j = 0; j < m1; j++) cout << ss[matrix1[bk1][j]] << " ";
for (int j = 0; j < m2; j++) cout << ss[matrix2[bk2][j]] << " ";
cout << "\n";
return 0;
}
详细
小提示:点击横条可展开更详细的信息
Test #1:
score: 0
Wrong Answer
time: 12ms
memory: 3712kb
input:
841 5 0.002262 paper rock rock scissors scissors 0.000665 rock paper paper scissors paper 0.001132 s...
output:
0.672778 paper paper rock scissors paper
result:
wrong answer 1st words differ - expected: '0.689135', found: '0.672778'
Test #2:
score: 10
Accepted
time: 3ms
memory: 3604kb
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: 0ms
memory: 3632kb
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
Time Limit Exceeded
input:
100000 12 0.000008 rock rock rock scissors paper scissors paper paper paper scissors paper scissors ...
output:
result:
Test #5:
score: 0
Wrong Answer
time: 1911ms
memory: 18292kb
input:
82918 11 0.000009 paper rock rock scissors scissors paper rock paper rock rock paper 0.000000 scisso...
output:
0.581083 paper rock paper paper paper scissors rock rock scissors scissors rock
result:
wrong answer 1st words differ - expected: '0.582727', found: '0.581083'
Test #6:
score: 0
Wrong Answer
time: 799ms
memory: 12212kb
input:
63157 10 0.000004 rock scissors paper scissors paper scissors rock paper rock scissors 0.000007 rock...
output:
0.584571 rock scissors rock paper rock scissors rock scissors rock paper
result:
wrong answer 1st words differ - expected: '0.587712', found: '0.584571'
Test #7:
score: 0
Time Limit Exceeded
input:
100000 12 0.000003 rock rock rock paper paper rock paper paper paper rock rock scissors 0.000001 pap...
output:
result:
Test #8:
score: 0
Wrong Answer
time: 1747ms
memory: 12752kb
input:
72055 11 0.000006 rock scissors scissors rock scissors scissors scissors scissors rock scissors scis...
output:
0.580789 scissors rock paper rock rock rock paper scissors scissors rock scissors
result:
wrong answer 1st words differ - expected: '0.584229', found: '0.580789'
Test #9:
score: 0
Wrong Answer
time: 1743ms
memory: 10708kb
input:
49463 12 0.000024 rock paper scissors paper rock scissors rock paper paper paper paper paper 0.00000...
output:
0.581145 rock paper rock scissors paper scissors rock rock paper paper rock paper
result:
wrong answer 1st words differ - expected: '0.584658', found: '0.581145'
Test #10:
score: 0
Time Limit Exceeded
input:
100000 12 0.000007 rock paper scissors paper paper scissors rock rock scissors rock scissors paper 0...