题目链接:http://acm.bnu.edu.cn/bnuoj/problem.php?search=2014+ACM-ICPC+Beijing+Invitational+Programming+Contest

总共十道题, 又结束了一场逗比的比赛, 感觉后半场都在梦游,结果被虐了!!!!大家都虐我一万里啊。

正如wushen说的,“那些被虐过的比赛,唯有赛后AK掉来泄愤。”

本弱太菜,还达不到AK的境界,只能搞出这场的8道题。

 

A    

一个很神奇的题目,全场就坑在这题了,其实应该画几组去看看的,比较容易发现规律的。

根据规则可以知道,一个数想要往下走一行,必须有个比它小的数在后面插入,把它推下去。

题目要求输出逆序 后 字典序最大的结果。

 

其实首先要每行是递增的。

然后每一行的数,在上一行找一个比它小,而且没有使用过的。

然后就形成了一颗颗链, 把链输出就是结果了。

也可以使用拓扑排序,结果是一样的。

 

这题就是要靠智商啊,要锻炼自己YY的能力了。

 

来代码吧!

  1 /* ***********************************************
  2 Author        :kuangbin
  3 Created Time  :2014/5/21 11:38:45
  4 File Name     :E:\2014ACM\比赛\2014北京邀请赛\A.cpp
  5 ************************************************ */
  6 
  7 #include <stdio.h>
  8 #include <string.h>
  9 #include <iostream>
 10 #include <algorithm>
 11 #include <vector>
 12 #include <queue>
 13 #include <set>
 14 #include <map>
 15 #include <string>
 16 #include <math.h>
 17 #include <stdlib.h>
 18 #include <time.h>
 19 using namespace std;
 20 const int MAXN = 100010;
 21 vector<int>vec[MAXN];
 22 int pre[MAXN];
 23 vector<int>ans;
 24 void add(int u)
 25 {
 26     if(u == -1)return ;
 27     add(pre[u]);
 28     ans.push_back(u);
 29 }
 30 
 31 int main()
 32 {
 33     //freopen("in.txt","r",stdin);
 34     //freopen("out.txt","w",stdout);
 35     int T;
 36     int iCase = 0;
 37     scanf("%d",&T);
 38     int n,m;
 39     while(T--)
 40     {
 41         iCase++;
 42         scanf("%d%d",&n,&m);
 43         for(int i = 0;i < m;i++)
 44             vec[i].clear();
 45         for(int i = 0;i < m;i++)
 46         {
 47             int num;
 48             int x;
 49             scanf("%d",&num);
 50             while(num--)
 51             {
 52                 scanf("%d",&x);
 53                 vec[i].push_back(x);
 54             }
 55         }
 56         bool flag = true;
 57         for(int i = 0;i < m;i++)
 58         {
 59             int sz = vec[i].size();
 60             for(int j = 1;j < sz;j++)
 61                 if(vec[i][j] < vec[i][j-1])
 62                 {
 63                     flag = false;
 64                     break;
 65                 }
 66         }
 67         if(!flag)
 68         {
 69             printf("Case #%d: No solution\n",iCase);
 70             continue;
 71         }
 72         memset(pre,-1,sizeof(pre));
 73         for(int i = m-1;i > 0;i--)
 74         {
 75             int sz = vec[i].size();
 76             int p = vec[i-1].size();
 77             for(int j = sz-1;j >= 0;j--)
 78             {
 79                 if(p <= 0)
 80                 {
 81                     flag = false;
 82                     break;
 83                 }
 84                 p = lower_bound(vec[i-1].begin(),vec[i-1].begin()+p,vec[i][j]) - vec[i-1].begin() + 1;
 85                 p--;
 86                 if(p <= 0)
 87                 {
 88                     flag = false;
 89                     break;
 90                 }
 91                 pre[vec[i-1][p-1]] = vec[i][j];
 92                 p--;
 93             }
 94         }
 95         if(!flag)
 96         {
 97             printf("Case #%d: No solution\n",iCase);
 98             continue;
 99         }
100         ans.clear();
101         for(int i = 0;i < vec[0].size();i++)
102             add(vec[0][i]);
103         printf("Case #%d:",iCase);
104         for(int i = 0;i < n;i++)
105             printf(" %d",ans[i]);
106         printf("\n");
107     }
108     
109     return 0;
110 }
代码君

相关文章:

  • 2021-12-30
  • 2022-01-20
  • 2021-06-27
  • 2021-11-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-26
  • 2022-12-23
  • 2021-03-31
相关资源
相似解决方案