【NOI题库】9269:Big String超级字符串

传送门:http://noi.openjudge.cn/ch0207/9269/

//------------------------------------题目内容--------------------------------------

9269:Big String超级字符串

总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB

描述

fish在无数次oi竞赛的狱炼之后,悟出一个真理,往往越容易的题目,陷阱越深。由此,fish创作了这道题目。

fish首先给出两个短串A=’4567’ (4个字符), B=’123’(3个字符)。反复进行如下的操作得到一个长串C。

(1)C=B+A (例如:A=’4567’ ,B=’123’ C=B+A=’1234567’)

(2)A=B B=C (上述例子 A=’123’ B=’1234567’)

请你编程找出这个长串的第n个字符。

---------

输入

第一行包含一个整数 n (1<=n<=10^9)

---------

输出

仅一行,包含一个字符,表示这个长串的第n个字符。

---------

样例输入

9

样例输出

2

//----------------------------------------解题-----------------------------------------

先来观察一下a,b,c的长度变化:

可以发现嘛,这个字符串的构成只有1,2,3,4,5,6,7这几个字符,

而且4,5,6,7只会属于‘4567’,而1,2,3只会属于‘123’,

然后呢,但操作次数为单数时,字符串【c】末段一定是‘4567’【长度为4】

但操作次数为偶数时,字符串【c】末段一定是‘123’【长度为3】

--------------------------------------------

思路:

可以用递归查找那个要找的那个字符在123或4567中的第几位,找到后输出就可以啦

代码:

 1 program chaojizifuchuan;
 2 var
 3   n,tochange,tcd:longint;
 4 //-----------------------------------------------------------------------------
 5 function need(t1:longint):longint;//需要进行几步操作
 6 var
 7   sum,xh,sum2,su:longint;
 8 begin
 9   xh:=2;              //默认需要两步
10   sum:=7;            //xh-1步的字符串长度
11   sum2:=10;          //xh步的字符串长度
12   while sum2<t1 do       //当xh步的字符串长度小于t1时
13   begin
14     inc(xh);                  //在增加一步
15     su:=sum2;                //备份sum2
16     sum2:=sum+sum2;        //增加sum2
17     sum:=su;                  //sum=上一步时的sum2
18   end;
19   if t1<=7 then xh:=1;   //如果t1小于等于7只需要一步即可
20   tochange:=sum2;     //tochange用于记录此时xh步的字符串长度【全局变量】
21   tcd:=sum;             //tcd用于记录此时xh-1步的字符串长度【全局变量】
22   exit(xh);              //返回xh步
23 end;
24 //-----------------------------------------------------------------------------
25 procedure printf(t2:char);
26 begin
27   writeln(t2);       //输出
28   halt;               //终止主程序
29 end;
30 //-----------------------------------------------------------------------------
31 procedure try(len:longint);
32 var
33   bu,total,last:longint;
34   c:string;
35 begin
36   if len<=7 then begin                //小于等于7时
37                          c:=‘1234567‘;
38                          printf(c[len]);
39                      end
40   else begin                               //大于7时
41             bu:=need(len);                   //求所需步数
42             total:=tochange;               //记录bu步时字符串长度
43             tochange:=0;                     //还原tochange
44             if odd(bu) then last:=4
45                   else last:=3; //如果所需步数为单数就是’4567‘结尾,若是双数就是‘123’结尾
46             if len>=total-last then begin     //如果在字符串末段
47                                                 if last=4 then c:=‘4567‘
48                                                    else c:=‘123‘; //last记录的是末段的长度嘛
49                                                 printf(c[len-total+last]);  //输出
50                                             end
51             else begin
52                      dec(bu);        //这个似乎可以删掉QAQ
53                      total:=tcd;   //上一步长度
54                      tcd:=0;    //还原tcd
55                      try(len-total);//继续try那个lastend到len段【其长度就是len减去上一步的长度】
56                    end;
57         end;
58
59 end;
60 //-----------------------------------------------------------------------------
61 begin
62     readln(n);              //读入
63     try(n);                   //try
64 end.

//中秋快乐QAQ         ----于2016.9.15

时间: 2024-10-07 05:50:04

【NOI题库】9269:Big String超级字符串的相关文章

openjudge 9269:Big String超级字符串

9269:Big String超级字符串 查看 提交 统计 提问 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB 描述 fish在无数次oi竞赛的狱炼之后,悟出一个真理,往往越容易的题目,陷阱越深.由此,fish创作了这道题目. fish首先给出两个短串A='4567' (4个字符), B='123'(3个字符).反复进行如下的操作得到一个长串C. (1)C=B+A (例如:A='4567' ,B='123' C=B+A='1234567') (2

noi Big String 超级字符串

//来自2017青岛信息竞赛第一题 9269:Big String超级字符串 查看 提交 统计 提问 总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  131072kB 描述 fish在无数次oi竞赛的狱炼之后,悟出一个真理,往往越容易的题目,陷阱越深.由此,fish创作了这道题目. fish首先给出两个短串A='4567' (4个字符), B='123'(3个字符).反复进行如下的操作得到一个长串C. (1)C=B+A (例如:A='4567' ,B='123

[NOI题库]1.1题解

今年NOIP居然"各有两道题目从NOI题库中抽取并在原题基础上改动后使用",不好好刷题怎么行. 这是第一篇题解文章,因为题目太水直接上代码了. 1.1编程基础之输入输出 01 Hello, World! 根据题意直接输出"Hello, World!"即可. #include <iostream> using namespace std; int main() { cout<<"Hello, World!"<<e

NOI题库 1768最大子矩阵 题解

NOI题库 1768最大子矩阵  题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩阵是 9 2 -4 1 -1 8 这个子矩阵的大小是15. 输入   输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依

[NOI题库]1.3编程基础之算术表达式与顺序执行 题解(一)

01 A+B问题 经典的A+B Problem——各大题库上的首题.读入$a,b$,输出$a+b$. #include <iostream> using namespace std; int main() { int a,b; cin>>a>>b; cout<<a+b<<endl; return 0; } 01.cpp 02 计算(a+b)*c的值 读入$a,b,c$,输出$c(a+b)$. #include <iostream> u

noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30

T21:单词替换 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入 输入包括3行,第1行是包含多个单词的字符串 s;第2行是待替换的单词a(长度 <= 100);第3行是a将被替换的单词b(长度 <= 100). s, a, b 最前面和最后面都没有空格. 输出 输出只有 1 行,将s中所有单词a替换成b之后的字符串. 样例输入 You w

noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T11——T20

T11 图像旋转 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= m <= 100.接下来n行,每行m个整数,表示图像的每个像素点灰度.相邻两个整数之间用单个空格隔开,每个元素均在0~255之间. 输出 m行,每行n个整数,为顺时针旋转90度后的图像.相邻两个整数之间用单个空格隔开. 样例输入 3 3 1 2 3 4 5 6 7 8 9 样例输出 7 4 1 8 5

NOI题库1799 最短前缀

1799:最短前缀 总时间限制: 1000ms 内存限制: 65536kB 描述 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon".注意到这里我们不认为空串是字串, 但是每个非空串是它自身的字串. 我们现在希望能用前缀来缩略的表示单词.例

noi题库(noi.openjudge.cn) 3.9数据结构之C++STL T1——T2

T1 1806:词典 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行.每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开.而且在词典中不会有某个外语单词出现超过两次.词典之后是一个空行,然后给出一个由外语单词组成的文档,文档不超过100000行,而且每行只包括一个外语单词.输入中出现单词只包括小写字母,而且长度不会超过10.输出在输出中,你需要把