QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#105171#6300. Best Carry Player 2schwarztWA 174ms3632kbC++141.7kb2023-05-13 15:18:362023-05-13 15:18:38

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-13 15:18:38]
  • 评测
  • 测评结果:WA
  • 用时:174ms
  • 内存:3632kb
  • [2023-05-13 15:18:36]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

#define ll __int128
void ckmin(ll &x, ll y) {
	x = min(x, y);
}
const int N = 19;
int k;
char str[N];
int bit[N];
ll shi[N];
ll dp[N][N][2];
void solve(int id) {
	scanf("%s%d", str + 1, &k);
	memset(bit, 0, sizeof bit);
	int n = strlen(str + 1);
	int m = n;
	int zero = 0;

	while (m >= 1 && str[m] == '0') m --, zero ++;
//	memset(dp, 0x3f, sizeof dp); // ?? 太小 ?? 
	for (int i = 0; i < N; i ++)
		for (int j = 0; j < N; j ++)
			dp[i][j][0] = dp[i][j][1] = 1e18;
	for (int i = 1, j = m; i <= m; i ++, j --)
		bit[i] = str[j] - '0';
	dp[0][0][0] = 0;
	for (int i = 1; i < N; i ++) {
		int a = bit[i];
		for (int j = 0; j <= k; j ++) {
			// 第 i 位 没有进位
			// i - 1 not
			ckmin(dp[i][j][0],dp[i - 1][j][0]);
			// i - 1 yes
			if (a != 9)
				ckmin(dp[i][j][0], dp[i - 1][j][1]); 
			
			if (j - 1 >= 0) {
				ll need = 10 - a;
				if (a != 0)
					ckmin(dp[i][j][1], need * shi[i - 1] + dp[i - 1][j - 1][0]);
				// i - 1 yes
				need = 9 - a;
				ckmin(dp[i][j][1], need * shi[i - 1] + dp[i - 1][j - 1][1]);
			}
		}
	}
	ll ans = min({dp[N - 1][k][0],dp[N-1][k][1]});
	assert(ans <= 9e18);
	if (ans==0) {
		vector<int> ans;
		for (int i = n; i >= 0; i --) {
			if (i == 0 || str[i] != '9') {
				ans.push_back(1);
				break;
			}
			ans.push_back(0);
		}
		reverse(ans.begin(), ans.end());
		for (auto p : ans)
			cout << p;
		puts("");
		return; 
	}
	printf("%lld", (long long)ans);
	for (int i = 0; i < zero; i ++)
		printf("0");
	puts("");
}

int main() {
	shi[0] = 1;
	for (int i = 1; i < N; i ++)
		shi[i] = shi[i - 1] * 10;
	int T;
	cin >> T;
	for (int i = 1; i <= T; i ++)
		solve(i);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3632kb

input:

4
12345678 0
12345678 5
12345678 18
990099 5

output:

1
54322
999999999987654322
9910

result:

ok 4 lines

Test #2:

score: 0
Accepted
time: 1ms
memory: 3608kb

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:

100000
10000
1000
100
10
1
900001
9900001
99900001
999900001
10000000001
9999910000
9999901000
9999900100
9999900010
9999900001
9000009999900001
99000009999900001
999000009999900001
99999999999999999900000000000000000
1000000000000000000

result:

ok 21 lines

Test #3:

score: -100
Wrong Answer
time: 174ms
memory: 3564kb

input:

100000
119111011091190000 10
1911011191011999 16
110099199000119 0
19009911191091011 13
199090909919000900 17
19009010011919110 5
90910190019900091 18
10911100000101111 1
110090011101119990 4
100909999119090000 12
90901119109011100 2
111010119991090101 4
900991019109199009 5
100919919990991119 8
911...

output:

88988908810000
8088988808988001
10
88808908989
9800909090080999100
80890
909089809980099909
9
80010
9090000880910000
8900
9909
991
9008900
8880880090
8080090801
8009900808909899
80880898981
909
8800909
99988889901
89908888089
980908890980099000
100
9889801
81
908890008099900891
880990801
9998099
890...

result:

wrong answer 47th lines differ - expected: '98890980099980009', found: '998890980099980009'