数据结构与算法专题题库

1003. 数据生成器

单点时限: 2.0 sec

内存限制: 512 MB

如何生成一个合法的出栈顺序?

这个问题看上去很抽象,我来给大家解释一下:在EOJ里面你们会看到一道题目叫“1.3 铁路调度”,为了给大家构造测试数据,我需要生成若干合法的出栈顺序,若干不合法的出栈顺序,用怎么样的一个算法可是使得生成出来的数据在尽可能多样的条件下,部分数据是合法的,部分数据是非法的。说的更明白一点的话:因为我们知道绝大多数的出栈顺序都是非法的,如果直接随机生成的话可能导致绝大多数数据都是非法的,甚至可能直接输出no就可以通过(大家可以自己体验一下),如果精心构造每一个样例又很浪费时间,所以我们需要一个算法来生成一个很强的数据。

为了通过这道题目,对于输出的数据有以下要求:

  • 具有一定的难度(也就是说不是随便写一个程序就可以通过你生成的数据)。
  • 至少有$ 40\% $到$ 60\% $数据的正确输出是yes,即生成的数据具有一定的多样性。
  • 数据的格式满足输入的要求。

或者,换句话说你可以:

  • 精心构造一组很具有迷惑性的数据,其他数据随机,但是要满足上述要求。
  • 你的程序可以近似等概率的生成所有可能的合法出栈顺序,甚至是所有非法的出栈顺序。

其实如果大家了解什么是黑盒攻击的话,或许能够更好的理解题目的意思!

(Special Judge)

输入格式

两个数$n,m$,$n$表示数据组数,$m$表示每组测试数据的出栈序列的长度。

只有一个测试数据:$ n=80,m=1000 $。

输出格式

总共$n$行,每行$m$个数,每行的$m + 1$个数,其中第1个数是$m$,从第$2$个数到第$m+1$个数是$1$到$m$的一个排列。

样例

Input
4 4
Output
4 1 2 3 4
4 4 3 2 1
4 4 3 1 2
4 3 4 1 2

提示

c++中在cstdlib中有rand()函数生成一个随机数,使用srand(time(NULL));生成随机数种子。

不限期开放

题目列表