社区讨论
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 条回复,欢迎继续交流。
正在加载回复...