Sample Input
1 8 1 2 3 1 2 4 3 4
Sample Output
00011011题意 : 把一串序列分成两个相同的串, 串的顺序要相同. 串1输出0;串2输入1 ;暴力搜索,每次找到一对相等的数字,一个给串1,一个给串2 ; 再往后找一对相等的整数,一个给串1 ,注意这个数必须大于前面给1的数,另一个给串2,这个也要比上次给串2的大.#include <cstdio> #include <cstring> #include <cstdlib> const int MAXN = 2010; int n; int num[MAXN]; int vis[MAXN]; bool DFS( int st, int last, int cur ) //从开始找相同的一对整数,last是上一次找的,给串2的位置. { if ( cur == n / 2 ) return true; //总共找出n/2对整数,即介绍. for ( int i = st; i < n; ++i ) if ( vis[i] == -1 ) { vis[i] = 0; //给串1,标记为0 for ( int j = i + 1; j < n; ++j ) if ( num[j] == num[i] && vis[j] == -1 && j > last )// j > last,给串2的要大于上次的, { vis[j] = 1; //给串2,标记为1 if ( DFS( i + 1, j, cur + 1 ) ) //接着搜索, return true; vis[j] = -1; } vis[i] = -1; break; } return false; } int main() { int T; scanf( "%d", &T ); while ( T-- ) { scanf( "%d", &n ); for ( int i = 0; i < n; ++i ) scanf( "%d", &num[i] ); memset( vis, -1, sizeof(vis) ); DFS( 0, 0, 0 ); for ( int i = 0; i < n; ++i ) printf( "%d", vis[i] ); puts(""); } return 0; }