求调
查看原帖
求调
1283951
csxx601cjy楼主2024/10/20 12:31

我不太擅长dfs,比赛时乱写了一通,只得了16分

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long n,m[200010],a[200010],c[400010],sum=0,Min=0x7fffffff;
bool vis[400010];
void dfs(int dep,long long mi,int lst){
	if(dep==n||mi==Min){
		sum+=mi;
		sum%=mod;
		return;
	}
	for(int i=lst;i<n*2;i++){
		if(!vis[i]){
			if(i<n)vis[i]=1,vis[i+n]=1;
			else vis[i]=1,vis[i-n]=1;
			dfs(dep+1,min(mi,c[i]),i+1);
			if(i<n)vis[i]=0,vis[i+n]=0;
			else vis[i]=0,vis[i-n]=0;
		}
	}
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++)cin>>m[i];
	for(int i=0;i<n;i++)cin>>a[i],c[i]=a[i]-1;
	for(int i=n;i<n*2;i++)c[i]=m[i-n]-a[i-n];
	for(int i=0;i<n*2;i++)Min=c[i]<Min?c[i]:Min;
	memset(vis,0,sizeof vis);
	dfs(0,0x7fffffff,0);
	cout<<(sum+1)%mod;
	return 0;
}
2024/10/20 12:31
加载中...