WA玄关求调
查看原帖
WA玄关求调
1098818
pbjyeee楼主2024/10/13 19:35

rt,思路就是筛合法的在10^5内的数,样例通过,求调

#include<bits/stdc++.h>
using namespace std;
const int MAXN=114514;
long long ans,all;
int c,t,n,v[20],cnt[20],maxv=0,pre[MAXN][10],fnt[10][MAXN],pl[20];
char lst[MAXN];
bool canfound[MAXN];
void dfs(int pl,int value){
	canfound[value]=1;
	for(int i=1;i<10;i++){
		if(pre[pl][i]!=0&&value*10+lst[pl]-'0'<MAXN){
			dfs(pre[pl][i],value*10+lst[pl]-'0');
		}
	}
}
signed main(){
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdin);
	cin>>c>>t;
	for(int tw=0;tw<t;tw++){ans=11451419198102233;all=0;
		memset(canfound,0,sizeof(canfound));memset(pre,0,sizeof(pre));memset(fnt,0,sizeof(fnt));memset(cnt,0,sizeof(cnt));memset(pl,0,sizeof(pl));
		cin>>lst;
		while(lst[n]!='\0'){n++;}
		//cout<<n<<endl;
		for(int i=1;i<10;i++){cin>>v[i];maxv=max(maxv,v[i]);}
		for(int i=0;i<n;i++){
			cnt[lst[i]-'0']++;
			for(int j=0;j<pl[lst[i]-'0'];j++){
				pre[fnt[lst[i]-'0'][j]][lst[i]-'0']=i;
				//cout<<fnt[lst[i]-'0'][j]<<' '<<lst[i]-'0'<<' '<<i<<endl;
			}
			pl[lst[i]-'0']=0;
			if(!canfound[lst[i]-'0']){
				canfound[lst[i]-'0']=1;
			}
			for(int j=1;j<10;j++){
				fnt[j][pl[j]]=i;pl[j]++;
			}
		}int save=9,ls[10]={0};
		for(int i=0;i<=n;i++){
			if(ls[lst[i]-'0']==0){
				dfs(i,0);ls[lst[i]-'0']=1;save--;
			}
			if(save==0){
				break;
			}
		}
		for(int i=1;i<10;i++){
			all+=cnt[i]*v[i];
		}
		for(long long i=1;i<MAXN;i++){
			long long save=all,pln=i;
			if(!canfound[i]){
				continue;
			}
			while(pln>0){
				save-=v[pln%10];
				pln/=10;
			}
			ans=min(ans,save+i);
		}
		cout<<ans<<endl;
	}
}
2024/10/13 19:35
加载中...