求助刚才 T1
  • 板块学术版
  • 楼主Eason_cyx大愚若智
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/13 18:34
  • 上次更新2024/10/13 20:06:33
查看原帖
求助刚才 T1
741244
Eason_cyx大愚若智楼主2024/10/13 18:34
#include <bits/stdc++.h>
#define int long long
using namespace std;
int v[15];
int now[15],pos[15];
bool flag[100005];
signed main() {
	int c,t; cin >> c >> t;
	while(t--) {
		string s; cin >> s;
		int n = s.size(); s = ' ' + s; int nc = 0;
		for(int i = 1;i <= 9;i++) cin >> v[i];
		memset(pos,0x3f,sizeof now); memset(flag,0,sizeof flag);
		now[0] = 0;
		while(true) {
			int minn = -0x7fffffff;
			for(int i = 1;i <= n;i++) {
				int I = s[i] - '0';
				if(flag[i]) continue;
				if(i <= pos[1]) {
					int need = pow(10,nc) * I;
					minn = max(minn,v[I] - need);
				}
				else if(i >= pos[nc]) {
					int need = I;
					minn = max(minn,v[I] - need);
				}
				for(int j = 1;j < nc;j++) {
					if(i >= pos[j] && i <= pos[j+1]) {
						int need = pow(10,nc-j) * I;
						minn = max(minn,v[I] - need);
					}
				}
			}
			if(minn <= 0) break;
			for(int i = 1;i <= n;i++) {
				int I = s[i] - '0';
				if(flag[i]) continue;
				int need = 0;
				if(i <= pos[1]) {
					need = max(need,(int)pow(10,nc) * I);
				}
				else if(i >= pos[nc]) {
					need = max(need,I);
				}
				for(int j = 1;j < nc;j++) {
					if(i >= pos[j] && i <= pos[j+1]) {
						need = max(need,(int)pow(10,nc-j) * I);
					}
				}
				if((v[s[i] - '0']) == minn) {
					int I = s[i] - '0'; flag[i] = true;
					for(int j = 0;j <= nc;j++) {
						if(i >= pos[j] && i <= pos[j+1]) {
							for(int k = nc;k >= j+1;k--) pos[k+1] = pos[k];
							pos[j+1] = i;
							for(int k = nc;k >= j+1;k--) now[k+1] = now[k];
							now[j+1] = i; break;
						}
					}
				}
			}
			cout << nc;
		}
		long long ans = 0;
		for(int i = 1;i <= n;i++) {
			if(flag[i]) continue;
			ans += v[s[i] - '0'];
		}
		long long qq = 0;
		for(int i = 1;i <= nc;i++) qq = qq * 10 + now[i];
		cout << ans + qq << endl;
	}
	return 0;
}

TLE 了。

2024/10/13 18:34
加载中...