求教
查看原帖
求教
55223
大可奇丽楼主2021/9/1 00:22

dalao们,我的代码除了第一个点全部WA,但是线下实验第二个点答案是正确的,能帮我看一下是什么问题吗?


#include<bits/stdc++.h>
using namespace std;
int ans[40];
int k1[40];
int k2[40];
void add(int* a,int* b){
	for(int i=0;i<40;i++){
		a[i]=a[i]+b[i];
		a[i+1]+=a[i]/10;
		a[i]%=10;
	}
}
void add(int* a,int b){
	a[0]+=b;
	for(int i=0;i<4;i++){
		a[i+3]+=a[i]/1000;
		a[i+2]+=a[i]/100%10;
		a[i+1]+=a[i]/10%10;
		a[i]%=10;
	}
}
bool bigger(int* a,int* b){
	for(int i=40;i>=0;i--){
		if(a[i]==b[i]){
			continue;
		}
		else if(a[i]>b[i]){
			return true;
		}
		else{
			return false;
		}
	}
	return true;
}
void multiple(int* a,int b){
	for(int i=0;i<40;i++){
		a[i]*=b;
	}
	for(int i=0;i<36;i++){
		a[i+4]+=a[i]/10000;
		a[i+3]+=a[i]/1000%10;
		a[i+2]+=a[i]/100%10;
		a[i+1]+=a[i]/10%10;
		a[i]%=10;
	}
}
int main(){
	memset(ans,0,sizeof(ans));
	int n,m;
	cin>>n>>m;
	int f[m][m][40];
	int now[m];
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>now[j];
		}
		memset(f,0,sizeof(f));
		for(int h=0;h<m;h++){
			for(int left=0;left<m-h;left++){
				int right=left+h;
				if(left==right){
					add(f[left][right],now[left]);
				}
				else{
					memset(k1,0,sizeof(k1));
					memset(k2,0,sizeof(k2));
					for(int g=0;g<40;g++){
						k1[g]=f[left+1][right][g];
						k2[g]=f[left][right-1][g];
					}
					multiple(k1,2);
					multiple(k2,2);
					add(k1,now[left]);
					add(k2,now[right]);
					if(bigger(k1,k2)){
						for(int g=0;g<40;g++){
							f[left][right][g]=k1[g];
						}
					}
					else{
						for(int g=0;g<40;g++){
							f[left][right][g]=k2[g];
						}
					}
				}
			}
		}
		add(ans,f[0][m-1]);
	}
	multiple(ans,2);
	bool flag=false;
	for(int i=40;i>=0;i--){
		if(flag==false&&ans[i]==0){
			continue;
		}
		else{
			flag=true;
			cout<<ans[i];
		}
	}
	if(flag==false){
		cout<<0;
	}
	return 0;
}
2021/9/1 00:22
加载中...