64pts玄关求调
查看原帖
64pts玄关求调
744853
FChang楼主2024/10/15 17:13
#include <bits/stdc++.h>
#define endl() putchar('\n')
#define space() putchar(' ')
#define int unsigned long long
using namespace std;

const int N = 2e5 + 5;

int n, ans, sum;

char a[N];

int val[N], nxt[N][10], first[10];

int num[N];

inline void init() {
	for (int i = 0; i <= n; ++i)
		for (int j = 0; j <= 9; ++ j) nxt[i][j] = 0;

	for (int j = 0; j <= 9; ++ j) first[j] = 0;


	for (int i = n; i >= 1; --i) {
		first[a[i]] = i;
		for (int j = 1; j <= 9; ++j) nxt[i][j] = nxt[i + 1][j];
		nxt[i][a[i + 1]] = i + 1;
	}

	return ;
}

inline void calc() {
	int res = sum - val[num[1]] - val[num[2]] - val[num[3]] - val[num[4]] - val[num[5]] - val[num[6]], now_id = first[num[1]], k = num[1];

	if(!now_id) return ;

	for (int i = 2; i <= 6; ++i) {
		if(!num[i]) return void(ans = min(ans, res + k));

		k = k * 10 + num[i];
		now_id = nxt[now_id][num[i]];

		if(!now_id) return ;
	}

	return void(ans = min(ans ,res + k));
}

signed main() {
	ios::sync_with_stdio(0);
	int id, T;
	scanf("%lld%lld", &id, &T);
	while (T--) {
		scanf("%s", a + 1);
		n = strlen(a + 1);
		for (int j = 1; j <= 9; ++j) scanf("%lld", &val[j]);

		sum = 0;
	
		for (int i = 1; i <= n; ++i) a[i] ^= 48, sum += val[a[i]];

		init();
		ans = sum;
		for (num[1] = 1; num[1] <= 9; ++num[1]) {
			calc();
			for (num[2] = 1; num[2] <= 9; ++num[2]) {
				calc();
				for (num[3] = 1; num[3] <= 9; ++num[3]) {
					calc();
					for (num[4] = 1; num[4] <= 9; ++num[4]) {
						calc();
						for (num[5] = 1; num[5] <= 9; ++num[5]) {
							calc();
							for (num[6] = 1; num[6] <= 9; ++num[6]) calc();
							num[6] = 0;
						}
						num[5] = 0;
					}
					num[4] = 0;
				}
				num[3] = 0;
			}
			num[2] = 0;
		}  // 真没想到,有一天我会为了不写DP来写这种大粪。
		printf("%lld\n", ans);
	}

	return 0;
}

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

qz

2024/10/15 17:13
加载中...