如此成绩,如何 CSP?
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
int c,a[20] = {0},cnt[20] = {0},n;
vector<int>pos[20];
int val(int i,int j,int k,int l,int m){
return i*10000+j*1000+k*100+l*10+m-a[i]-a[j]-a[k]-a[l]-a[m];
}
bool check(int a,int b,int c,int d,int e,bool pr = 0){
if(pr)cout<<"check:"<<a<<b<<c<<d<<e<<endl;
if(a==0)return check(b,c,d,e,-1,pr);
//if(pos[a].size()==0 or pos[b].size()==0 or pos[c].size()==0 or pos[d].size()==0 or pos[e].size()==0)return false;
if(pos[a].size()==0)return false;
int dpos = pos[a][0];
if(pr)cout<<dpos<<endl;
dpos = upper_bound(pos[b].begin(),pos[b].end(),dpos)-pos[b].begin();
if(pr)cout<<dpos<<endl;
if(dpos==pos[b].end()-pos[b].begin())return false;
dpos = pos[b][dpos];
if(c==-1)return true;
dpos = upper_bound(pos[c].begin(),pos[c].end(),dpos)-pos[c].begin();
if(pr)cout<<dpos<<endl;
if(dpos==pos[c].end()-pos[c].begin())return false;
dpos = pos[c][dpos];
if(d==-1)return true;
dpos = upper_bound(pos[d].begin(),pos[d].end(),dpos)-pos[d].begin();
if(pr)cout<<dpos<<endl;
if(dpos==pos[d].end()-pos[d].begin())return false;
dpos = pos[d][dpos];
if(e==-1)return true;
dpos = upper_bound(pos[e].begin(),pos[e].end(),dpos)-pos[e].begin();
if(pr)cout<<dpos<<endl;
if(dpos==pos[e].end()-pos[e].begin())return false;
return true;
}
signed main(){
//freopen("bargain5.in","r",stdin);
cin.tie();
cout.tie();
int T;
cin>>c>>T;
while(T--){
int ans = 0;
string s;
cin>>s;
n = s.length();
for(int i = 1;i<=9;i++){
while(pos[i].size()!=0)pos[i].pop_back();
cin>>a[i];
cnt[i] = 0;
}
//cout<<n<<endl;
for(int i = 0;i<n;i++){
cnt[s[i]-'0']++;
pos[s[i]-'0'].push_back(i);
}
for(int i = 1;i<=9;i++){
//cout<<pos[i]<<endl;
ans+=cnt[i]*a[i];
}
//cout<<endl;
int ma = 0;
for(int i = 0;i<=9;i++){
for(int j = 0;j<=9;j++){
if(i!=0 and j==0)continue;
for(int k = 0;k<=9;k++){
if(j!=0 and k==0)continue;
for(int l = 0;l<=9;l++){
if(k!=0 and l==0)continue;
for(int m = 1;m<=9;m++){
if(i==0 and j==0 and k==0 and l==0){
ma = min(m-a[m],ma);
}
if(l!=0 and m==0)continue;
if(!check(i,j,k,l,m))continue;
cout<<i<<j<<k<<l<<m<<" "<<ans+val(i,j,k,l,m)<<endl;
//check(i,j,k,l,m,1);
ma = min(val(i,j,k,l,m),ma);
}
}
}
}
}
//check(0,0,0,1,2,1);
//cout<<ans<<" "<<ma<<endl;
cout<<ans+ma<<endl;
}
return 0;
}
/*
0
1
993933939
1 1 99999 1 1 1 1 1 10000
*/