【题解】牛客2025年七夕节比赛-J
J 诡异的激光
一道充满着随机的题目,这里给出一种随机的做法,如果想使用概率dp来做,那也是可以的。
随机生成激光
次,选择经过次数最少的位置即可。
<del>据ai证明,该做法的通过率大约在99%以上</del>
对于数据出锅,加强后仍然很弱,在这里出题人深表歉意。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using i64 = long long;
using loli = long long;
using ull = unsigned long long;
mt19937_64 rnd(time(0));
constexpr int mod = 998244353;
constexpr int inf = 0x3f3f3f3f;
constexpr ll linf = 0x3f3f3f3f3f3f3f3f;
template<typename T>
istream& operator >> (istream& in, vector<T>& a) {
for (auto &i : a) {
cin >> i;
}
return in;
}
template<typename T>
istream& operator << (istream& in, vector<T>& a) {
for (int i = 1; i < a.size(); i++) {
cin >> a[i];
}
return in;
}
template<typename T>
ostream& operator << (ostream& out, vector<T>& a) {
if (a.size() == 0)
return out;
for (auto& i : a) {
out << i << ' ';
}
return (out << '\n');
}
template<typename T>
ostream& operator << (ostream& out, vector<vector<T>>& a) {
for (auto& i : a)
out << i;
return (out);
}
auto main() -> signed {
cin.tie(0), ios::sync_with_stdio(0);
auto baka_loli_killer = [&]() -> int {
int n, m, k; cin >> n >> m >> k;
vector<pair<int, int>> p(k);
vector<vector<int>> a(n, vector<int>(m));
for (auto& [x, y] : p) cin >> x >> y, x--, y--, a[x][y] = inf;
auto add = [&](int i, int j) {
auto& [x1, y1] = p[i];
auto& [x2, y2] = p[j];
vector<pair<int, int>> go;
int x = x1, y = y1;
while (x1 < x2) go.emplace_back(1, 0), x1++;
while (x1 > x2) go.emplace_back(-1, 0), x1--;
while (y1 < y2) go.emplace_back(0, 1), y1++;
while (y1 > y2) go.emplace_back(0, -1), y1--;
shuffle(go.begin(), go.end(), rnd);
a[x][y]++;
for (auto& [dx, dy] : go) {
x += dx, y += dy;
a[x][y]++;
}
};
vector<int> v(n);
iota(v.begin(), v.end(), 0);
for (int i = 0; i < 50; i++) {
shuffle(v.begin(), v.end(), rnd);
for (int i = 0; i < n / 2; i++) {
add(v[i], v[i + n / 2]);
}
}
int tarx = 0, tary = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] < a[tarx][tary]) tarx = i, tary = j;
}
}
// cerr << a << '\n';
cout << tarx + 1 << ' ' << tary + 1 << '\n';
return 0;
};
int t; cin >> t;
while (t--) {
baka_loli_killer();
}
return 0;
}
查看28道真题和解析