社区讨论

S-T1 RE求调

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m27gmmoi
此快照首次捕获于
2024/10/13 18:46
去年
此快照最后确认于
2025/11/04 17:15
4 个月前
查看原帖
实在搞不懂咋报RE的
CPP
#include <bits/stdc++.h>
using namespace std;
int c,T,v[10],vis[10],gone[10][10][10][10][10];
string s;
int inter(string s){
	int res = 0;
	for (int i = 0;i < s.length();i++){
		res = res*10 + (int)(s[i]-'0');
	}
	return res;
}
string put(char c1,char c2){
	string ans = "";
	ans += c1;ans += c2;
	return ans;
}
int solve(string s){
	int minn = inter(s);
	if (s.length()==1) minn = min(minn,v[s[0]-'0']);
	if (s.length()==2){
		minn = min(minn,v[s[0]-'0']+min(s[1]-'0',v[s[1]-'0']));
		minn = min(minn,v[s[1]-'0']+min(s[0]-'0',v[s[0]-'0']));
	}
	if (s.length()==3){
		minn = min(minn,v[s[0]-'0']+solve(put(s[1],s[2])));
		minn = min(minn,v[s[1]-'0']+solve(put(s[0],s[2])));
		minn = min(minn,v[s[2]-'0']+solve(put(s[0],s[1])));
	}
	if (s.length()==4){
		minn = min(minn,v[s[0]-'0']+solve(put(s[1],s[2])+s[3]));
		minn = min(minn,v[s[1]-'0']+solve(put(s[0],s[2])+s[3]));
		minn = min(minn,v[s[2]-'0']+solve(put(s[0],s[1])+s[3]));
		minn = min(minn,v[s[3]-'0']+solve(put(s[0],s[1])+s[2]));
	}
	if (s.length()==5){
		minn = min(minn,v[s[0]-'0']+solve(put(s[1],s[2])+put(s[3],s[4])));
		minn = min(minn,v[s[1]-'0']+solve(put(s[0],s[2])+put(s[3],s[4])));
		minn = min(minn,v[s[2]-'0']+solve(put(s[0],s[1])+put(s[3],s[4])));
		minn = min(minn,v[s[3]-'0']+solve(put(s[0],s[1])+put(s[2],s[4])));
		minn = min(minn,v[s[3]-'0']+solve(put(s[0],s[1])+put(s[2],s[3])));
	}
	return minn;
}
bool check(string s){
	bool flag=true;
	vis[s[0]-'0']--;vis[s[1]-'0']--;
	vis[s[2]-'0']--;vis[s[3]-'0']--;vis[s[4]-'0']--;
	for (int i = 0;i < 5;i++) if (vis[i] < 0) flag= false;
	vis[s[0]-'0']++;vis[s[1]-'0']++;
	vis[s[2]-'0']++;vis[s[3]-'0']++;vis[s[4]-'0']++;
	return flag;
}
int solve2(string s){
	long long minn=LONG_LONG_MAX;
	for (int i = 0;i < s.length();i++){
		for (int j = i+1;j < s.length();j++){
			for (int k = j+1;k < s.length();k++){
				for (int p = k+1;p < s.length();p++){
					for (int q = p+1;q < s.length();q++){
						if (gone[i][j][k][p][q]) continue;
						gone[i][j][k][p][q]=1;
						string x1 = put(s[i],s[j]);
						string x2 = put(s[k],s[p]);
						string x = x1+x2;x += s[q];
						if (!check(x)) continue;
						vis[s[i]-'0']--;vis[s[j]-'0']--;
						vis[s[k]-'0']--;vis[s[p]-'0']--;vis[s[q]-'0']--;
						long long cost = 0;
						for (int w = 1;w <= 10;w++) cost += v[w]*vis[w];
						cost += solve(x);
						minn = min(minn,cost);
						vis[s[i]-'0']++;vis[s[j]-'0']++;
						vis[s[k]-'0']++;vis[s[p]-'0']++;vis[s[q]-'0']++;
					}
				}
			}
		}
	}
	return minn;
}
int main(){
	cin >> c >> T;
	while (T--){
		cin >> s;
		memset(vis,0,sizeof(vis));
		memset(gone,0,sizeof(gone));
		for (int i = 1;i <= 9;i++) cin >> v[i];
		for (int i = 0;i < s.length();i++) vis[s[i]-'0']++;
		if (s.length() <= 5) cout << solve(s) << endl;
		else cout << solve2(s) << endl;
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...