QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#477089 | #5537. Storing Eggs | karuna# | TL | 520ms | 85032kb | C++20 | 3.2kb | 2024-07-13 23:12:52 | 2024-07-13 23:12:53 |
Judging History
answer
#include <bits/stdc++.h>
#define ff first
#define ss second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int SZ = 110;
int n, s, a[3][SZ];
int dp[SZ][SZ][1 << 6], blk[SZ];
int ds(pii p, pii q) {
return (p.ff - q.ff) * (p.ff - q.ff) + (p.ss - q.ss) * (p.ss - q.ss);
}
int cost[SZ][SZ][1 << 6][1 << 6];
int main() {
cin.tie(0); ios_base::sync_with_stdio(0);
cin >> n >> s;
for (int t = 0; t < 3; t++) {
string S;
cin >> S;
for (int i = 1; i <= n; i++) {
if (S[i - 1] == '#') a[t][i] = true;
}
}
a[0][0] = a[1][0] = a[2][0] = true;
for (int i = 1; i <= n; i++) {
for (int t = 0; t < 3; t++) blk[i] ^= (1 - a[t][i]) << t;
for (int t = 0; t < 3; t++) blk[i] ^= (1 - a[t][i - 1]) << (t + 3);
}
dp[0][0][0] = 1e9;
for (int k = 1; k <= s; k++) {
for (int i = 1; i <= n; i++) {
for (int msk = 0; msk < (1 << 6); msk++) {
if ((blk[i] & msk) != msk) continue;
// case 1. from i - 1
if (k >= __builtin_popcount(msk & 7) && __builtin_popcount(msk & 7) != 0) {
for (int up = 0; up < (1 << 3); up++) {
int prv = (msk >> 3) | (up << 3);
if ((blk[i - 1] & prv) != prv) continue;
if (cost[i][i - 1][msk][prv] == 0) {
vector<pii> L, R;
for (int t = 0; t < 3; t++) if (msk >> t & 1) R.push_back({t, i});
for (int t = 0; t < 3; t++) if (prv >> t & 1) L.push_back({t, i - 1});
for (int t = 0; t < 3; t++) if (prv >> (t + 3) & 1) L.push_back({t, i - 2});
int minv = 1e9;
for (int i = 0; i < R.size(); i++) for (int j = 0; j < i; j++) {
minv = min(minv, ds(R[i], R[j]));
}
for (pii p : L) for (pii q : R) {
minv = min(minv, ds(p, q));
}
cost[i][i - 1][msk][prv] = minv;
}
dp[k][i][msk] = max(dp[k][i][msk], min(dp[k - __builtin_popcount(msk & 7)][i - 1][prv], cost[i][i - 1][msk][prv]));
}
}
// case 2. from before i - 1
if (k >= __builtin_popcount(msk) && __builtin_popcount(msk) != 0) {
for (int j = 0; j < i - 1; j++) {
for (int prv = 0; prv < (1 << 6); prv++) {
if ((blk[j] & prv) != prv) continue;
if (cost[i][j][msk][prv] == 0) {
vector<pii> L, R;
for (int t = 0; t < 3; t++) if (msk >> t & 1) R.push_back({t, i});
for (int t = 0; t < 3; t++) if (msk >> (t + 3) & 1) R.push_back({t, i - 1});
for (int t = 0; t < 3; t++) if (prv >> t & 1) L.push_back({t, j});
for (int t = 0; t < 3; t++) if (prv >> (t + 3) & 1) L.push_back({t, j - 1});
int minv = 1e9;
for (int i = 0; i < R.size(); i++) for (int j = 0; j < i; j++) {
minv = min(minv, ds(R[i], R[j]));
}
for (pii p : L) for (pii q : R) {
minv = min(minv, ds(p, q));
}
cost[i][j][msk][prv] = minv;
}
dp[k][i][msk] = max(dp[k][i][msk], min(dp[k - __builtin_popcount(msk)][j][prv], cost[i][j][msk][prv]));
}
}
}
}
}
}
int ans = 0;
for (int i = 0; i <= n; i++) {
for (int msk = 0; msk < (1 << 6); msk++) {
ans = max(ans, dp[s][i][msk]);
}
}
if (ans == 0) return !(cout << "-1\n");
cout.precision(10);
cout << fixed << sqrt(ans) << '\n';
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 4036kb
input:
5 2 #.... ..... ....#
output:
4.4721359550
result:
ok found '4.4721360', expected '4.4721360', error '0.0000000'
Test #2:
score: 0
Accepted
time: 1ms
memory: 4008kb
input:
5 6 ##.## ##### .....
output:
1.0000000000
result:
ok found '1.0000000', expected '1.0000000', error '0.0000000'
Test #3:
score: 0
Accepted
time: 1ms
memory: 3956kb
input:
3 4 ..# ... ...
output:
1.4142135624
result:
ok found '1.4142136', expected '1.4142140', error '0.0000003'
Test #4:
score: 0
Accepted
time: 0ms
memory: 3668kb
input:
2 6 .. .# ..
output:
-1
result:
ok found '-1.0000000', expected '-1.0000000', error '-0.0000000'
Test #5:
score: 0
Accepted
time: 0ms
memory: 3876kb
input:
1 2 . . .
output:
2.0000000000
result:
ok found '2.0000000', expected '2.0000000', error '0.0000000'
Test #6:
score: 0
Accepted
time: 520ms
memory: 85032kb
input:
100 2 .................................................................................................... .................................................................................................... ...............................................................................................
output:
99.0201999594
result:
ok found '99.0202000', expected '99.0202000', error '0.0000000'
Test #7:
score: -100
Time Limit Exceeded
input:
100 3 .................................................................................................... .................................................................................................... ...............................................................................................