过样例,0pts 玄关求调
查看原帖
过样例,0pts 玄关求调
744853
FChang楼主2024/10/14 23:11
#include <bits/stdc++.h>
#define int long long
#define endl() putchar('\n')
#define space() putchar(' ')
using namespace std;
const int N = 2e5 + 5;

inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
	return x * f;
}

inline void write(int x) {
	if (x < 0) putchar('-'), x = -x;
	if (x > 9) write(x / 10);
	return void(putchar(x % 10 + 48));
}

int n;

char a[N];

int val[N], dp[N][10], sum[N], mn[N];

signed main() {
	int id = read(), T = read();
	while (T--) {
		scanf("%s", a + 1);
		n = strlen(a + 1);
		for (int i = 1; i <= n; ++i) {
			for (int j = 0; j <= 7; ++j) dp[i][j] = 0;
			a[i] = a[i] - '0';
			sum[i] = 0;
		}
		for (int i = 1; i <= 9; ++i) val[i] = read(), mn[i - 1] = 1e18;

		for (int i = n; i >= 1; --i) sum[i] = sum[i + 1] + val[(int)a[i]];

		for (int i = 1; i <= n; ++i) {
			dp[i][0] = dp[i - 1][0] + val[(int)a[i]];
			
			for (int j = min(i, 6LL); j >= 1; --j) {
				
				if (j == 1) dp[i][j] = dp[i - 1][0] + (int)a[i];
				else dp[i][j] = mn[j - 1] + (int)a[i];
				
				if (mn[j] + val[(int)a[i]] > dp[i][j] * 10) {
					
					mn[j] = dp[i][j] * 10;
					
				} else mn[j] += val[(int)a[i]];
			}
		
		}

		int ans = LONG_LONG_MAX;

		for (int i = 1; i <= n; ++i)
			for (int j = 0; j <= min(i, 6LL); ++j) ans = min(ans, dp[i][j] + sum[i + 1]);

		printf("%lld\n", ans);
	}
	return void(endl()), signed(0);
}

/*
0
1
123
10 10 10 10 10 10 10 10 10
*/

qz

2024/10/14 23:11
加载中...