QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#562740 | #6300. Best Carry Player 2 | HTensor# | WA | 1ms | 3676kb | C++17 | 3.1kb | 2024-09-13 20:23:00 | 2024-09-13 20:23:01 |
Judging History
answer
#include <bits/stdc++.h>
#define dd(x) cout << #x << "\n"
#define d(x) cout << #x << ": " << x << "\n"
using namespace std;
#define int __int128
using pii = pair<int, int>;
using vpii = vector<pii>;
using vi = vector<int>;
using vii = vector<vector<int>>;
using a3 = array<int, 3>;
const int inf = 1e18;
istream &operator>>(istream &is, __int128 &x) {
string s;
is >> s;
bool neg = false;
x = 0;
for (char c : s) {
if (c == '-') neg = true;
else x = x * 10 + (c - '0');
}
if (neg) x = -x;
return is;
}
ostream &operator<<(ostream &os, __int128 x) {
if (x == 0) os << 0;
else {
string s, t;
if (x < 0) x = -x, t = "-";
while (x) s.push_back('0' + x % 10), x /= 10;
reverse(s.begin(), s.end());
os << t << s;
}
return os;
}
void solve() {
int x, k;
cin >> x >> k;
int tx = x;
int a[20]{};
int pw[20]{};
pw[0] = 1;
for (int i = 0; i < 18; i++) {
a[i] = tx % 10;
tx /= 10;
pw[i + 1] = pw[i] * 10;
}
if (k == 0) {
for (int i = 0; i < 18; i++) {
if (a[i] != 9) {
cout << 1;
}
for (int j = 0; j < i - 1; j++) {
cout << 0;
}
cout << "\n";
return;
}
}
vector dp(18, vector(20, vector<int>(2, -1)));
for (int i = 0; i < 18; i++) {
dp[i][0][0] = 0;
}
if (a[0] != 0)
dp[0][1][1] = 10 - a[0];
for (int i = 1; i < 18; i++) {
for (int j = 1; j <= i + 1; j++) {
if (dp[i - 1][j][0] != -1) {
dp[i][j][0] = dp[i - 1][j][0];
}
if (a[i] != 9 && dp[i - 1][j][1] != -1) {
if (dp[i][j][0] != -1) {
dp[i][j][0] = min(dp[i][j][0], dp[i - 1][j][1]);
} else {
dp[i][j][0] = dp[i - 1][j][1];
}
}
if (dp[i - 1][j - 1][1] != -1) {
dp[i][j][1] = dp[i - 1][j - 1][1] + (9 - a[i]) * pw[i];
}
if (a[i] != 0 && dp[i - 1][j - 1][0] != -1) {
if (dp[i][j][1] != -1) {
dp[i][j][1] = min(dp[i][j][1], dp[i - 1][j - 1][0] + (10 - a[i]) * pw[i]);
} else {
dp[i][j][1] = dp[i - 1][j - 1][0] + (10 - a[i]) * pw[i];
}
}
// cerr << i << " " << j << " " << dp[i][j][0] << " " << dp[i][j][1] << "\n";
}
}
// for (int i = 0; i < 18; i++) {
// for (int j = 0; j <= i + 1; j++) {
// cerr << i << " " << j << " " << dp[i][j][0] << " " << dp[i][j][1] << "\n";
// }
// }
int ans = max(dp[17][k][0], dp[17][k][1]);
for (int t = 0; t < 2; t++) {
if (dp[17][k][t] != -1) {
ans = min(ans, dp[17][k][t]);
}
}
cout << ans << "\n";
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0);
int T; cin >> T;
while(T--) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3572kb
input:
4 12345678 0 12345678 5 12345678 18 990099 5
output:
1 54322 999999999987654322 9910
result:
ok 4 lines
Test #2:
score: -100
Wrong Answer
time: 1ms
memory: 3676kb
input:
21 999990000099999 0 999990000099999 1 999990000099999 2 999990000099999 3 999990000099999 4 999990000099999 5 999990000099999 6 999990000099999 7 999990000099999 8 999990000099999 9 999990000099999 10 999990000099999 11 999990000099999 12 999990000099999 13 999990000099999 14 999990000099999 15 999...
output:
10000 1000 100 10 1 900001 9900001 99900001 999900001 10000000001 9999910000 9999901000 9999900100 9999900010 9999900001 9000009999900001 99000009999900001 999000009999900001 -1
result:
wrong answer 1st lines differ - expected: '100000', found: ''