模拟做的,但是不知道怎么判断数位的出现顺序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
#define MAXN 1000010
#define MAXM 3000010
#define R(x) x=read()
#define W(x) write(x)
#define int long long
#define INF 0x3f3f3f3f
#define lc x<<1
#define rc x<<1|1
inline int read()
{
int x,y;
char c=getchar();
x=0,y=1;
while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+(c^'0');c=getchar();}
return x*y;
}
inline void write(int x)
{
if(x<0) {putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int tot[MAXN]={0};
int dig[MAXN];
signed main()
{
// freopen("bargain2.in","r",stdin);
// freopen("bargain.out","w",stdout);
int c;
R(c);
int t;
R(t);
while(t--)
{
string s;
cin>>s;
int lens=s.size();
s=" "+s;
for(int i=1;i<=9;i++)
tot[i]=0;
for(int i=1;i<=9;i++)
R(dig[i]);
dig[0]=0;
for(int i=1;i<=lens;i++)
tot[s[i]-'0']++;
tot[0]=6;
int ans=0,now=0;
int minn;
for(int i=1;i<=lens;i++)
ans+=dig[s[i]-'0'];
minn=ans;
for(int i=0;i<=9;i++)
for(int j=0;j<=9;j++)
for(int k=0;k<=9;k++)
for(int l=0;l<=9;l++)
for(int m=0;m<=9;m++)
{
now=i*10000+j*1000+k*100+l*10+m;
tot[i]--;tot[j]--;tot[k]--;tot[l]--;tot[m]--;
if(tot[i]>=0&&tot[j]>=0&&tot[k]>=0&&tot[l]>=0&&tot[m]>=0)
now+=ans-dig[i]-dig[j]-dig[k]-dig[l]-dig[m];
else
{
tot[i]++;tot[j]++;tot[k]++;tot[l]++;tot[m]++;
continue;
}
tot[i]++;tot[j]++;tot[k]++;tot[l]++;tot[m]++;
minn=min(now,minn);
}
cout<<minn<<endl;
}
return 0;
}