虽然知道不会有人帮忙调,但还是发出来了,球球各位大神提一点建议。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10,inf=0x3f3f3f3f3f3f3f3f;
int n,v[10],ans=inf,num[10],lg,cas,T,nxt[N][10],lst[10],sum[10],ns[10];
string s;
int log10(int x){
int res=1;
for(int i=1;i<=6;i++){
res*=10;
if(res>x) return i;
}
return -1;
}
int qp(int a,int b){
int res=1;
while(b){
if(b&1) res=res*a;
a=a*a;
b>>=1;
}
return res;
}
void work(){
int res=0,ma,x,nw,nans=0;
bool vis[10]={};
for(int i=1;i<=lg;i++)
res=res*10+num[i];
for(int i=1;i<=9;i++) nans+=(sum[i]-ns[i])*v[i];
for(int i=1;i<=lg;i++){
ma=0,x=0,nw=0;
for(int j=lg;j;j--){
if(vis[j]) continue;
nw++;
//cout<<j<<":"<<nw<<" "<<res-(res-res%qp(10,nw))/10-res%qp(10,nw-1)-v[num[j]]<<endl;
if((res-(res-res%qp(10,nw))/10-res%qp(10,nw-1)-v[num[j]])>ma){
ma=res-((res-res%qp(10,nw))/10+res%qp(10,nw-1))-v[num[j]];
x=i;
}
}
//cout<<endl<<ma<<" "<<x<<" "<<res<<endl;
if(res<=v[num[x]]){
ans=min(ans,nans+res);
return ;
}
vis[x]=1;
res=res-ma-v[num[x]];
nans+=v[num[x]];
}
ans=min(ans,nans);
}
void dfs(int x,int la){
if(x==lg+1){
work();
return ;
}
for(int i=1;i<=9;i++){
if(nxt[la][i]==inf) continue;
num[x]=i;
if(ns[i]==sum[i]) continue;
ns[i]++;
dfs(x+1,nxt[la][i]);
ns[i]--;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>cas>>T;
while(T--){
//cout<<endl<<":"<<endl;
for(int i=0;i<=n;i++) nxt[i][1]=nxt[i][2]=nxt[i][3]=nxt[i][4]=nxt[i][5]=nxt[i][6]=nxt[i][7]=nxt[i][8]=nxt[i][9]=inf;
for(int i=1;i<=9;i++) sum[i]=ns[i]=0;
ans=inf,lg=0;
cin>>s;
n=s.size();
s=" "+s;
for(int i=1;i<=n;i++){
for(int j=1;j<=9;j++) nxt[lst[j]][s[i]-'0']=i;
lst[s[i]-'0']=i;
sum[s[i]-'0']++;
}
for(int i=1;i<=9;i++){
cin>>v[i];
lg=max(lg,log10(v[i]));
}
//cout<<lg<<endl;
dfs(1,0);
cout<<ans<<endl;
}
return 0;
}