有两个版本的代码,请问有什么区别?
查看原帖
有两个版本的代码,请问有什么区别?
1406930
ninoy楼主2024/11/7 21:00
#include <bits/stdc++.h>
using namespace std;

int s[5];
int a[5][25]={0};
int l[5]={0},r[5]={0};
int k[5];

void dfs(int x,int y){
	if(y>s[x]||x>4){
		int f=max(l[x],r[x]);
		k[x]=min(f,k[x]);
		return ;
	}
	
	l[x]+=a[x][y];
	dfs(x,y+1);
	l[x]-=a[x][y];
	
	r[x]+=a[x][y];
	dfs(x,y+1);
	r[x]-=a[x][y];
}
 
int main(){

    cin>>s[1]>>s[2]>>s[3]>>s[4];
    for(int i=1;i<=s[1];i++){
    	cin>>a[1][i];
	}
	for(int i=1;i<=s[2];i++){
    	cin>>a[2][i];
	}
	for(int i=1;i<=s[3];i++){
    	cin>>a[3][i];
	}
	for(int i=1;i<=s[4];i++){
    	cin>>a[4][i];
	}
	memset(k,40000,sizeof(k));
	dfs(1,1);
	int ans=0;
	for(int i=1;i<=4;i++){
		dfs(i,1);
	}
	for(int i=1;i<=4;i++){
		ans+=k[i];
	}
	cout<<ans<<endl;
	return 0;
}

这个是第一段,我把dfs函数一次只处理一科的习题,然后用for循环循环4科,然后ac了。 但是下面这一段代码好像就不行。

#include <bits/stdc++.h>
using namespace std;

int s[5];
int a[5][25]={0};
int l[5]={0},r[5]={0};
int k[5];

void dfs(int x,int y){
	if(y>s[x]||x>4){
		int f=max(l[x],r[x]);
		k[x]=min(f,k[x]);
		if(x>=4){
			return ;
		}else{
			dfs(x+1,1);//如果x<4,x加一来处理下一个学科
		}
		return ;
	}
	
	l[x]+=a[x][y];
	dfs(x,y+1);
	l[x]-=a[x][y];
	
	r[x]+=a[x][y];
	dfs(x,y+1);
	r[x]-=a[x][y];
}
 
int main(){

    cin>>s[1]>>s[2]>>s[3]>>s[4];
    for(int i=1;i<=s[1];i++){
    	cin>>a[1][i];
	}
	for(int i=1;i<=s[2];i++){
    	cin>>a[2][i];
	}
	for(int i=1;i<=s[3];i++){
    	cin>>a[3][i];
	}
	for(int i=1;i<=s[4];i++){
    	cin>>a[4][i];
	}
	memset(k,40000,sizeof(k));
	dfs(1,1);
	int ans=0;
	for(int i=1;i<=4;i++){
		ans+=k[i];
	}
	cout<<ans<<endl;
	return 0;
}

第二段代码我打算用一个dfs函数来处理四科,想法是处理完一科以后,x就会加一处理下一科,但是tle了8个样例,请问第二段代码比第一段慢在了哪里,求各位大佬解答

2024/11/7 21:00
加载中...