1 solutions
-
0
难度: 黄/绿
算法: 深度优先搜索
把输入的从小到大排序。
我们发现,当前所有 中最小的那个,不在当前序列最左边,就在最右边。因为需要字典序最小,我们肯定希望它在左边。然后直接挨个搜。
剪枝较少,细节很多,注意细节。不会搜就看代码。
#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