社区讨论

刚学OI的蒟蒻求调

P1001A+B Problem参与者 5已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@mhj1m2n3
此快照首次捕获于
2025/11/03 19:14
4 个月前
此快照最后确认于
2025/11/03 20:35
4 个月前
查看原帖
RE了,在本地测都是对的,整数负数都是正常运行。
CPP
#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 GJ_jia(string a,string b);
bool GJ_bj(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 GJ_jian(string a,string b){
	string Ans="\0";
	if(a[0]=='-'&&b[0]!='-'){
		a.erase(0,1);
		if(GJ_bj(a,b))Ans="-";
	}else if(b[0]=='-'&&a[0]!='-'){
		b.erase(0,1);
		if(GJ_bj(b,a))Ans="-";
	}else if(a[0]=='-'&&b[0]=='-'){
		a.erase(0,1);
		b.erase(0,1);
		string ANS="-"+GJ_jia(a,b);
		return ANS;
	}
	if(GJ_bj(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 GJ_jia(string a,string b){
	if(a[0]=='-'||b[0]=='-')return GJ_jian(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,GJ_jia(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(!GJ_bj(GJ_jia(dist[u],w),dist[v])){
				dist[v]=GJ_jia(dist[u],w);
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
	cout<<dist[2];
	return 0;
}

回复

12 条回复,欢迎继续交流。

正在加载回复...