站外题求助

学术版

你说得对,但是网上所有做法在我这儿都 AC 不了。对了悬关。
by Breath_of_the_Wild @ 2024-03-30 19:53:39


@[Breath_of_the_Wild](/user/964817) 两边平方就不需要开根和 `double` 了。
by Nagasaki_Soyo @ 2024-03-30 19:58:50


@[Nagasaki_Soyo](/user/1081109) 但是还超时。能帮我优化优化吗。 $1\le n,m\le 1000,1\le d\le 100$,$d$ 最多一位小数
by Breath_of_the_Wild @ 2024-03-30 20:05:51


@[Breath_of_the_Wild](/user/964817) ```cpp inline int dist(int a, int b, int c, int d) { return (a - c) * (a - c) + (b - d) * (b - d); } signed main() { cin.tie(nullptr)->sync_with_stdio(false); cin >> n >> m >> d; clock_t st = clock(); int dd = d * d * 100; memset(ans, 0x7f, sizeof ans); ans[1][1] = 0; for (int i = 1; i <= n; i++) { for (int k = i; k <= i + d && k <= n; k++) now[k] = 1; // 第 k 行至多走到 now[k] 的位置 for (int j = 1; j <= m; j++) { for (int k = i; k <= i + d && k <= n; k++) { while (now[k] <= m && dist(i, j, k, now[k]) * 100 <= dd) chkmin(ans[k][now[k]], ans[i][j] + 1), now[k]++; } } } cout << ans[n][m] << '\n'; fprintf(stderr, "%.4lf ms\n", 1e3 * (clock() - st) / CLOCKS_PER_SEC); return 0; } ```
by Nagasaki_Soyo @ 2024-03-30 21:35:37


双指针做到 $O(n^2d)$。
by Nagasaki_Soyo @ 2024-03-30 21:50:37


|