普及组
(请选手务必仔细阅读本页内容)
一.题目概况
| 中文题目名称 | 字符串解压缩 | 弹性小球 | 折型最大 | 数字串 |
| 英文题目与子目录名 | string | ball | folding | number |
| 可执行文件名 | string | ball | folding | number |
| 输入文件名 | string.in | ball.in | folding.in | number.in |
| 输出文件名 | string.out | ball.out | folding.out | number.out |
| 每个测试点时限 | 1 秒 | 1 秒 | 1 秒 | 1 秒 |
| 测试点数目 | 10 | 10 | 10 | 10 |
| 每个测试点分值 | 10 | 10 | 10 | 10 |
| 附加样例文件 | 有 | 有 | 有 | 有 |
| 结果比较方式 | 全文比较(过滤行末空格及文末回车) | |||
| 题目类型 | 传统 | 传统 | 传统 | 传统 |
| 对于pascal 语言 | string.pas | ball.pas | folding.pas | number.pas |
| 对于c 语言 | string.c | ball.c | folding.c | number.c |
| 对于c++ 语言 | string.cpp | ball.cpp | folding.cpp | number.cpp |
| 对于pascal 语言 | fpc string.pas | fpc ball.pas | fpc folding.pas | fpc number.pas |
| 对于c 语言 | gcc -o string string.c -lm | gcc -o ball ball.c -lm | gcc -o folding folding.c -lm | gcc -o number number.c -lm |
| 对于c++ 语言 | g++ -o string string.cpp -lm | g++ -o ball ball.cpp -lm | g++ -o folding folding.cpp -lm | g++ -o number number.cpp -lm |
| 内存上限 | 128M | 128M | 128M | 128M |
1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。
3、统一评测时采用的机器配置为:CPU P4 3.0GHz,内存 2G,上述时限以此配置为准。
4、特别提醒:评测在Windows下进行,评测软件为cena8.0。
字符串解压缩
(string.pas/c/cpp)
【题目描述】
观察这个字符串‘AAAABCCCCCDDDD’,它均由大写英文字母组成,其长度为14,我们可以把这个字符串压缩成‘4AB5C4D’,压缩后长度为7,压缩规则是:假设某连续出现的同一字母的数量为n,则其在压缩字符串中为‘n字母’,若n=1则n必须省略。因为倘若‘1’不省略,则字符串‘AABCDE’会被压缩成‘2A1B1C1D1E’,长度反而变大了。
任务:编一程序,根据被压缩的字符串求出原来的字符串。
【输入格式】
输入文件仅有一行为一个长度为L的压缩过的字符串。(并且字母都是大写英文字母),保证字符串中间的数字在[2,100],即(2≤数字≤100);
【输出格式】
输出原字符串(字符串可能会很长,每40个字符换行)。
【样例输入】
3A4B7D
【样例输出】
AAABBBBDDDDDDD
【数据规模】
对于30%的数据:2≤L≤20;
对于60%的数据:2≤L≤250;
对于100%的数据:2≤L≤1,000;
弹性小球
(ball.pas/c/cpp)
【题目描述】
笨笨有一个弹性小球,小球有一个能量值E。
笨笨走进一个M*N房间,房间有M行N列。一开始在左上角,以向右下角45°的方向弹射小球。小球有两个性质:
1. 小球在运动过程中不会损失能量,只有在碰壁或碰角的时候才会损失能量,当能量<=0了小球就停止运动了;
2. 小球弹射遵循反射定律,小球碰角会原路返回(请参照右边图画)。
请聪明的你告诉笨笨弹性小球在这个房间中的运动轨迹。
【输入格式】
第一行三个整数M、N、E,表示房间的行数和列数、小球的初始能量。
第二行八个整数,分别是小球撞到上(北)、右(东)、下(南)、左(西)、左上(西北)、右上(东北)、右下(东南)、左下(西南)损失的能量。
【输出格式】
输出一张小球运动的轨迹图(详见样例)。轨迹图要求如下:
1.整个(M+2)*(N+2)的图,外面要有边框,上下各N个'-',左右各M个'|';
其中map[1,1]=map[1,N+2]=map[M+2,1]=map[M+2,N+2]为1个空格;
2. 小球运动轨迹用'/'和'\\'表示,其他部分用' '(空格)表示。
【样例输入1】
2 2 5
2 3 4 6 1 1 3 9
【样例输出1】
--
|\\ |
| \\|
--
【样例输入2】
3 5 6
1 1 1 1 1 1 1 1
【样例输出2】
-----
|\/ /\\|
|/\/ /|
|\/\/ |
-----
【数据规模】
对于30%的数据:1≤M,N≤10; 0 (folding.pas/c/cpp) 【题目描述】 折型在日常生活中随处可见,比如闪电符号“ ”,显示器的四个角等等;折型大致可以分为四种类型(“┌”,“┐”,“└”,“┘”)。笨笨只对“┘”这种折型特别感兴趣(萝卜青菜,各有所爱),笨笨想在一个二维矩阵中求“┘”这种数字加和最大的折型,具体规定如下描述: 对于一个N行*M列的矩阵,一个折型区域必须满足: 1、它的形状为“┘”(不能是“└”,“┌”,或“┐”); 2、它的宽度为1; 3、它的横向长度和纵向长度都必须大于1且连续,不能等于1(即不能退化为一条线或一个点); 现给出这个二维矩阵,求其中数字和最大的这种折型区域。 【输入格式】 第一行为N,M,中间用一个空格隔开,N表示矩阵的行数,M表示矩阵的列数; 接下来是N行,每行M个整数,每2个整数之间用1个空格隔开,每个整数A[i,j]在[-100,100]; 【输出格式】 一行一个整数,即满足题目要求的折型区域的最大数字和。 【样例输入】 4 4 -2 5 0 3 -1 1 0 -3 3 -2 -4 -6 -3 5 -5 5 【样例输出】 7 【样例解释】如右图所示,符合要求的折型区域数字和最大 【数据规模】 对于30%的数据:2≤M,N≤100; 对于60%的数据:2≤M,N≤500; 对于100%的数据:2≤M,N≤1,000; -100≤A[i,j]≤100; 数字串 (number.pas/c/cpp) 【题目描述】 给你一个长度为n的数字串,数字串里会包含1~m这些数字。如果连续的一段数字子串包含了1~m这些数字,则称这个数字子串为NUM串。你的任务是求出长度最短的NUM串,为了降低难度,你只需要输出这个长度即可。 【输入格式】 第一行给定n和m,中间用1个空格隔开; 第二行n个整数,表示数字串,每2个数字之间用1个空格隔开;第i个整数为A[i]; 【输出格式】 如果存在NUM串则输出最短NUM串长度, 否则第一行输出“NO”(不包含引号),第二行按照由小到大输出构成NUM串还至少需要哪些数字,每2个整数之间用1个空格隔开。 【样例输入1】 7 3 2 1 1 3 3 3 2 【样例输出1】 4 【样例输入2】 10 6 1 2 3 3 2 1 1 1 1 1 【样例输出2】 NO 4 5 6 【数据规模】 对于30%的数据:1≤M,N≤1,000; 对于60%的数据:1≤M,N≤100,000; 对于100%的数据:1≤M,N≤200,000; 1≤A[i]≤m;下载本文