QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#795583#5054. City Brainrlc202204WA 7ms102044kbC++172.5kb2024-11-30 21:49:402024-11-30 21:49:42

Judging History

你现在查看的是最新测评结果

  • [2024-11-30 21:49:42]
  • 评测
  • 测评结果:WA
  • 用时:7ms
  • 内存:102044kb
  • [2024-11-30 21:49:40]
  • 提交

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;
} 

Details

Tip: Click on the bar to expand more detailed information

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'