萌新求助
  • 板块学术版
  • 楼主封禁用户
  • 当前回复35
  • 已保存回复35
  • 发布时间2020/7/21 12:26
  • 上次更新2023/11/6 22:41:35
查看原帖
萌新求助
133151
封禁用户楼主2020/7/21 12:26

题目是进行N组a-b后然后a+c

然鹅TLE了 加上火车头依旧TLE

求:卡常方法

#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#include<bits/stdc++.h>
using namespace std;
string  a1,b1;
int a[100001],b[100001],c[100001];
string Add(string as,string bs){
	int la=as.size(),lb=bs.size();
	int lc=max(la,lb)+1;
	//逆向存储
	for(int i=0;i<la;++i){
		a[i]=as[la-1-i]-'0';
	} 
	for(int i=0;i<lb;++i){
		b[i]=bs[lb-1-i]-'0';
	} 
	//列竖式模拟加法
	for(int i=0;i<lc-1;++i){
		c[i]+=a[i]+b[i];
		c[i+1]=c[i]/10;
		c[i]%=10;
	}
	//去除前导0
	while(c[lc-1]==0&&lc>1){
		--lc;
	} string s;
	for(int i=lc-1;i>=0;--i){
		s+=c[i]+'0';
	}
	return s;
}
string Minu(string as,string bs){
	bool nega=false;
	if(as.size()<bs.size()||as.size()==bs.size()&&as<bs){
		as.swap(bs);
		nega=true;
	}
	int la=as.size(),lb=bs.size();
	int lc=la;
	for(int i=0;i<la;++i){
		a[i]=as[la-1-i]-'0';
	}
	for(int i=0;i<lb;++i){
		b[i]=bs[lb-1-i]-'0';
	}
	for(int i=0;i<lc;++i){
		if(a[i]<b[i]){
			a[i+1]--;
			a[i]+=10;
		}
		c[i]=a[i]-b[i];
	}
	while(c[lc-1]==0 && lc>1){
		lc--;
	}
	string s;
	if(nega==true) s+='-';
	for(int i=lc-1;i>=0;--i){
		s+=c[i]+'0';
	}
	return s;
}
int main(){
	int n;
	cin >> n;
	string x;
	for(int i=1;i<=n;++i){
		cin>>a1>>b1;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		x=Add(x,a1);
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		cout<<Minu(x,b1)<<endl;
	}
}
2020/7/21 12:26
加载中...