5 条题解

  • 2
    @ 2026-3-25 20:00:25

    太难了,这一看就是一道单源最短路径问题,考虑SPFA,同时还要考虑过大的数字,显然需要用到高精度。

    #include<bits/stdc++.h>
    using namespace std;
    string a,b,dist[10];
    bool vis[10];
    struct node{
    	int v;
    	string w;
    };
    vector<node> vct[10];
    queue<int> q;
    string add_(string a,string b);
    bool compare(string a,string b){
    	if(a=="INT_MAX")return 1;
    	if(b=="INT_MAX")return 0;
    	int la=a.length(),lb=b.length();
    	if(la!=lb)return la>lb;
    	for(int i=0;i<la;i++){
    		if(a[i]-'0'!=b[i]-'0')return (a[i]-'0')>(b[i]-'0');
    	}
    	return 0;
    }
    string delete(string a,string b){
    	string Ans="\0";
    	if(a[0]=='-'&&b[0]!='-'){
    		a.erase(0,1);
    		if(compare(a,b))Ans="-";
    	}else if(b[0]=='-'&&a[0]!='-'){
    		b.erase(0,1);
    		if(compare(b,a))Ans="-";
    	}else if(a[0]=='-'&&b[0]=='-'){
    		a.erase(0,1);
    		b.erase(0,1);
    		string ANS="-"+add_(a,b);
    		return ANS;
    	}
    	if(compare(b,a))swap(a,b);
    	int c[1005]={0},d[1005]={0},ans[1005]={0};
    	int la=a.length(),lb=b.length(),lans=max(a.length(),b.length());
    	for(int i=0;i<la;i++)c[i+1]=a[la-i-1]-'0';
    	for(int i=0;i<lb;i++)d[i+1]=b[lb-i-1]-'0';
    	for(int i=1;i<=max(la,lb);i++){
    		if(c[i]<d[i]){
    			c[i+1]--;
    			c[i]+=10;
    		}
    		ans[i]=c[i]-d[i];
    	}
    	while(lans>1&&ans[lans]==0)lans--;
    	for(int i=lans;i>=1;i--){
    		char ansi=ans[i]+'0';
    		Ans=Ans+ansi;
    	}
    	return Ans;
    }
    string add_(string a,string b){
    	if(a[0]=='-'||b[0]=='-')return delete(a,b);
    	int c[1005]={0},d[1005]={0},ans[1005]={0};
    	int la=a.length(),lb=b.length(),lans=max(a.length(),b.length())+1;
    	for(int i=0;i<la;i++)c[i+1]=a[la-i-1]-'0';
    	for(int i=0;i<lb;i++)d[i+1]=b[lb-i-1]-'0';
    	for(int i=1;i<=max(la,lb);i++){
    		ans[i]+=c[i]+d[i];
    		ans[i+1]=ans[i]/10;
    		ans[i]%=10;
    	}
    	if(ans[lans]==0)lans--;
    	string Ans="\0";
    	for(int i=lans;i>=1;i--){
    		char ansi=ans[i]+'0';
    		Ans=Ans+ansi;
    	}
    	return Ans;
    }
    int main(){
    	cin>>a>>b;
    	vct[1].push_back({2,add_(a,b)});
    	for(int i=1;i<=10;i++){
    		dist[i]="INT_MAX";
    	}
    	dist[1]="0";
    	vis[1]=1;
    	q.push(1);
    	while(q.size()){
    		int u=q.front();
    		q.pop();
    		vis[u]=0;
    		for(int i=0;i<vct[u].size();i++){
    			int v=vct[u][i].v;
    			string w=vct[u][i].w;
    			if(!compare(add_(dist[u],w),dist[v])){
    				dist[v]=add_(dist[u],w);
    				if(!vis[v]){
    					vis[v]=1;
    					q.push(v);
    				}
    			}
    		}
    	}
    	cout<<dist[2];
    	return 0;
    }
    

    信息

    ID
    19
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    29
    已通过
    24
    上传者