求条
查看原帖
求条
856459
yangjunhan1楼主2024/10/15 17:39

虽然知道不会有人帮忙调,但还是发出来了,球球各位大神提一点建议。

#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;
}
2024/10/15 17:39
加载中...