蓝桥杯练习系统 ID: 279 3000米排名预测

3000米排名预测
 

Description

 

3000米长跑时,围观党们兴高采烈地预测着最后的排名。因为他们来自不同的班,对所有运动员不一定都了解,于是他们分别对自己了解的一些运动员的实力作出了评估,即对部分运动员做了相对排名的预测,并且告诉了可怜留守的班长。因为无聊,于是他们就组团去打Dota去了。比赛结束后他们向班长询问最后的排名,但班长不记得了,只记得他们中哪些人的预测是正确的,哪些人的预测是错误的。他们想知道比赛的排名可能是什么。

 

Input

 

第一行两个整数n, m,n为运动员数量,m为围观党数量。运动员编号从0到n-1。

接下来m行,每行为一个围观党的相对排名预测。每行第一个数c表示他预测的人数,后面跟着c个0~n-1的不同的数,表示他预测的运动员相对排名,最后还有一个数,0表示这个预测是错误的,1表示是正确的。

 

Output

 

第一行一个数k为有多少种排名的可能。

下面k行,每行一个0~n-1的排列,为某一个可能的排名,相邻的数间用空格隔开。所有排名按字典序依次输出。

 

Sample Input 1 

3 2
2 0 1 1
2 1 2 0

Sample Output 1

2
0 2 1
2 0 1

Sample Input 2 

3 2
2 0 1 1
2 2 1 0

Sample Output 2

1
0 1 2

Hint

HINT:时间限制:1.0s 内存限制:256.0MB

1<=n<=10, 2<=c<=n, 1<=m<=10,保证数据合法,且答案中排名可能数不超过20000。对于一个排名序列,一个预测是正确的,当且仅当预测的排名的相对顺序是排名序列的一个子序列。一个预测是错误的,当且仅当这个预测不正确。

Source

蓝桥杯练习系统 ID: 279 原题链接: http://lx.lanqiao.cn/problem.page?gpid=T279

 

 

 

递归枚举

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int N = 20010, M = 20;
 6 int n, m, resNum;
 7 int a[M][M], b[M], res[N][M];
 8 int way[M];
 9 bool st[M];
10 
11 bool check()
12 {
13     for(int i = 1; i <= m; i ++)
14     {
15         int k = 1;
16         if(b[i])
17         {
18             for(int j = 1; k <= a[i][0] && j <= n; j ++)
19                 if(way[j] == a[i][k])
20                     k ++;
21             if(k != a[i][0]+1) return false;    
22         }
23         else
24         {
25             for(int j = 1; k <= a[i][0] && j <= n; j ++)
26                 if(way[j] == a[i][k])
27                     k ++;
28             if(k == a[i][0]+1) return false;    
29         }
30     }
31     return true;
32 }
33 //枚举第u位
34 void dfs(int u)
35 {
36     if(u == n+1 && check())
37     {
38         resNum ++;
39         for(int i = 1; i <= n; i ++) res[resNum][i] = way[i];
40         return ;
41     }
42     
43     for(int i = 0; i < n; i ++)
44     {
45         if(!st[i]){
46             way[u] = i;
47             st[i] = true;
48             dfs(u+1);
49             st[i] = false;
50         }
51     }
52 }
53 int main()
54 {
55     cin >> n >> m;
56     for(int i = 1; i <= m; i ++)
57     {
58         cin >> a[i][0];
59         for(int j = 1; j <= a[i][0]; j ++) cin >> a[i][j];
60         cin >> b[i];
61     }
62     
63     dfs(1);
64     cout << resNum << endl;
65     for(int i = 1; i <= resNum; i ++)
66     {
67         for(int j = 1; j <= n; j ++)
68             cout << res[i][j] << " ";
69         cout << endl;
70     }
71 }

 

posted @ 2022-03-19 17:44  泥烟  阅读(82)  评论(0编辑  收藏  举报