QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#795583 | #5054. City Brain | rlc202204 | WA | 7ms | 102044kb | C++17 | 2.5kb | 2024-11-30 21:49:40 | 2024-11-30 21:49:42 |
Judging History
answer
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5005;
const int M = 5005;
const int inf = 0x3f3f3f3f;
void read(int &x) {
x = 0;
char ch = getchar();
while (ch > '9' || ch < '0')
ch = getchar();
while (ch >= '0' && ch <= '9')
x = x * 10 + ch - '0', ch = getchar();
}
int n, m, k;
vector<int> e[N];
int d[2][N] = {{0}};
void bfs(int s, int id) {
queue<int> q;
q.push(s), d[id][s] = 0;
while (!q.empty()) {
int h = q.front();
q.pop();
for (auto i: e[h])
if (d[id][i] > d[id][h] + 1) {
d[id][i] = d[id][h] + 1;
q.push(i);
}
}
}
int f[N][N] = {{0}};
int s1, t1, s2, t2;
int dfs(int x, int y) {
if (f[x][y] != -1)
return f[x][y];
if (x == s1 && y == s2)
return f[x][y] = 0;
f[x][y] = 0;
for (auto u: e[x])
if (d[0][u] + 1 == d[0][x]) {
f[x][y] = max(f[x][y], dfs(u, y));
for (auto v: e[y])
if (d[1][v] + 1 == d[1][y]) {
f[x][y] = max(f[x][y], dfs(x, v));
f[x][y] = max(f[x][y], dfs(u, v) + (u == v && x == y));
}
}
return f[x][y];
}
int A[N] = {0}, B[N] = {0};
void upd(int *arr, int len, int val) {
for (int i = 1; i <= len; i++)
arr[i] = val;
}
int main() {
read(n), read(m), read(k);
for (int i = 1, u, v; i <= m; i++) {
read(u), read(v);
e[u].push_back(v);
e[v].push_back(u);
}
read(s1), read(t1), read(s2), read(t2);
memset(d, 0x3f, sizeof d);
bfs(s1, 0), bfs(s2, 1);
memset(f, -1, sizeof f);
int b = dfs(t1, t2);
int a = d[0][t1] + d[1][t2] - b * 2;
//当前有 a 个 1,b 个权值为 2 的 1
//有 k 次机会
for (int i = 1; i <= a; i++)
A[i] = 1;
for (int i = 1; i <= b; i++)
B[i] = 1;
if (k <= b) {
upd(B, k, 2);
}
else {
k -= b;
upd(B, b, 2);
if (k <= a) {
upd(A, k, 2);
}
else {
k -= a;
upd(A, a, 2);
if (k <= b) {
upd(B, k, 3);
}
else {
k -= b;
upd(B, b, 3);
if (k <= b) {
upd(B, k, 4);
}
else {
k -= b;
upd(B, b, 4);
//剩下的是先 a 再 b
int r = k / n;
upd(A, a, 2 + r);
upd(B, b, 4 + r);
k %= n;
for (int i = 1; i <= a && k; i++, k--)
A[i] = 3 + r;
for (int i = 1; i <= b && k; i++, k--)
B[i] = 5 + r;
}
}
}
}
double ans = 0;
for (int i = 1; i <= a; i++)
ans += 1.0 / A[i];
for (int i = 1; i <= b; i++)
ans += 2.0 / B[i];
printf("%.11lf\n", ans);
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 101760kb
input:
6 5 1 1 2 3 2 2 4 4 5 4 6 1 5 3 6
output:
5.00000000000
result:
ok found '5.000000000', expected '5.000000000', error '0.000000000'
Test #2:
score: 0
Accepted
time: 0ms
memory: 102044kb
input:
1 0 100 1 1 1 1
output:
0.00000000000
result:
ok found '0.000000000', expected '0.000000000', error '-0.000000000'
Test #3:
score: 0
Accepted
time: 7ms
memory: 101880kb
input:
4 2 3 1 2 3 4 1 2 3 4
output:
0.83333333333
result:
ok found '0.833333333', expected '0.833333333', error '0.000000000'
Test #4:
score: -100
Wrong Answer
time: 0ms
memory: 101920kb
input:
6 5 1 1 2 3 2 2 4 4 5 4 6 1 5 6 3
output:
5.50000000000
result:
wrong answer 1st numbers differ - expected: '5.0000000', found: '5.5000000', error = '0.1000000'