求朱
  • 板块灌水区
  • 楼主pengbonan
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/14 20:59
  • 上次更新2024/10/14 22:29:52
查看原帖
求朱
1005693
pengbonan楼主2024/10/14 20:59

80pts80pts
P1874P1874

#include <iostream>
#include <cmath>
using namespace std;
#define int __int128
void read (int &n) {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')
			f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + (ch ^ 48);
        ch = getchar();
    }
    n = x * f;
}
void print (int n) {
    if (n < 0) {
        putchar('-');
        n *= -1;
    }
    if (n > 9)
		print(n / 10);
    putchar(n % 10 + '0');
}
const int N = 50 + 5, M = 1e5 + 30;
int num[N];
int Q (int L, int r) {
	return (signed)num[r] - (signed)num[L - 1] * pow(10ull, (unsigned long long)(r - L + 1));
}
unsigned long long dp[N][M];
signed main () {
	string s;
	unsigned long long n;
	cin >> s >> n;
	s = " " + s;
	int L = s.size();
	string _s = " ";
	for (int i = 1; i < L; i ++) {
		if (s[i] != '0')
			_s = _s + s[i];
	}
	s = _s;
	L = s.size();
	for (int i = 1; i < L; i ++)
		num[i] = num[i - 1] * 10 + (s[i] ^ 48);
	for (int i = 0; i <= L + 1; i ++)
		for (int j = 0; j <= n + 1; j ++)
			dp[i][j] = 0x3f3f3f3full * 0x3f3f3f3f;
	dp[0][0] = 0;
	for (int i = 1; i < L; i ++)
		for (int k = 1; k < 12; k ++)
			if (i >= k)
				for (int j = Q(i - k + 1, i); j <= n; j ++)
					dp[i][j] = min(dp[i][j], dp[i - k][j - Q(i - k + 1, i)] + 1);
	if (dp[L - 1][n] > (L - 1))
		cout << -1;
	else
		cout << dp[L - 1][n] - 1; 
	return 0;
}
2024/10/14 20:59
加载中...