1 solutions

  • 0
    @ 2023-10-22 23:52:57

    难度: 黄/绿

    算法: 深度优先搜索

    把输入的从小到大排序。

    我们发现,当前所有 aia_i 中最小的那个,不在当前序列最左边,就在最右边。因为需要字典序最小,我们肯定希望它在左边。然后直接挨个搜。

    剪枝较少,细节很多,注意细节。不会搜就看代码。

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[2010],s[505],t;
    stack<int> l,r,pr;
    void se(int le,int ri,int k){
    	if(k==n/2){
    		if(le+ri!=a[n]) return ;
    		while(!l.empty()){
    			pr.push(l.top());
    			l.pop();
    		}
    		while(!pr.empty()){
    			printf("%d ",pr.top());
    			pr.pop();
    		}
    		while(!r.empty()){
    			printf("%d ",r.top());
    			r.pop();
    		}
    		exit(0);
    	}
    	if(le+ri>=a[n]) return ;
    	k++;
    	if(a[k]>le&&a[k]-ri<501&&s[a[k]-le]==1){
    		l.push(a[k]-le);
    		se(a[k],ri,k);
    		l.pop();
    	}
    	if(a[k]>ri&&a[k]-ri<501&&s[a[k]-ri]==1){
    		r.push(a[k]-ri);
    		se(le,a[k],k);
    		r.pop();
    	}
    	return ;
    }
    int main(){
        scanf("%d",&n);
        n*=2;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
        	scanf("%d",&t);
        	s[t]=1;
    	}
    	se(0,0,0);
    }
    
    • 1

    Information

    ID
    23
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    # Submissions
    20
    Accepted
    3
    Uploaded By