all WA 玄关求调
查看原帖
all WA 玄关求调
780255
HardWhite楼主2024/10/16 20:07

大概是预处理and暴搜 只有样例一是对的

#include<bits/stdc++.h>

using namespace std;

const int N=1e5+200;
long long summ;
int a[100000],num[10][10],val[10];
int m,n;
bool tempf[10]={1,1,1,1,1,1,1,1,1,1};
int wi=1;
string sn;

int oper(int x,int sum,int sumval,int dep,bool *f){
	sum=sum*10+x;
	sumval+=val[x];
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++){
			num[i][j]=0;
		}
	}
	if(sumval>sum) {
		return sum-sumval;
	} 
	if(dep>=wi){
		return 0;
	}
	bool tf[10];
	for(int i=1;i<=9;i++){
		tf[i]=f[i];
	}
	for(int i=1;i<=9;i++){
		num[0][i]=1;
	}
	for(int i=1;i<=9;i++){
		if(tf[i]&&num[x][i]) continue;
		tf[i]=0;
	}
	int ans=N;
	for(int i=1;i<=9;i++){
		if(tf[i]){
			ans=min(ans,oper(i,sum,sumval,dep+1,tf));
		}
	}
	ans=min(ans,0);
	return ans;
}



int main(){
	cin>>m>>n;
	for(int nn=1;nn<=n;nn++){
		wi=0;
		summ=0;
		cin>>sn;
		while(sn[wi]>'0'&&sn[wi]<='9'){
			wi++;
			a[wi]=sn[wi-1]-'0';
			
		}
		for(int i=1;i<=9;i++){
			cin>>val[i];
		}
		for(int i=1;i<=wi;i++){
			summ+=val[a[i]];
			for(int j=1;j<=9;j++){
				if(num[j][j]==1){
					num[a[i]][j]=1;
				}
			}
		} 
		cout<<summ+oper(0,0,0,0,tempf)<<endl;	
	}
	return 0;
}
2024/10/16 20:07
加载中...