2019年广东工业大学腾讯杯新生程序设计竞赛--M--破碎的愿望

2019年广东工业大学腾讯杯新生程序设计竞赛–M--破碎的愿望
M-破碎的愿望
接下来将是一些没有实际作用还会扰乱你心智的一堆废话!!
「Rhongomyniad!」
圣枪击穿了圣杯,原本就仅有一个碎片的虚假圣杯,现在更是变成了一撮辉煌的粉末,散失地飞舞在空中。是破碎的无数梦想的实体。并不是为了什么正义,仅仅是有必要结束这一切。由曾是御主(master)的我取得的圣杯的碎片,应当由我去结束这一切。
「师父」
「回去了,格蕾」身边的黑泥应该不久就会自行消散,回归大源了吧
「为什么会变成这样,圣杯不是万能的愿望机吗」
「因为无法实现的愿望就是无法实现啊」我叹了一口气「世界的前进只是在不断的循环。那个人固然是天才,但无法做到的事情就是无法做到。所以他放弃了」
「我不明白」
「人类史的最初可以比作一个字符串,把原本的字符串翻转后拼接到原来的字符串后面,就会得到一个新的字符串,如此的反复,人类史就是如此进行着无限的延伸。所以如果你想要知道这个无限延伸的字符串上的某个字符,是很简单的一件事。但不可能得到那些不存在于这个字符串上的字符啊。」
「那师父为什么你还不放弃呢」
「我想证明这是错误的」
格蕾没有再多问 。
ok废话结束.
输入描述:
第一行输入n (1<=n<=30)和k (1<=k<=10^18),代表字符串最初的长度和所需要知道的字符的序号
第二行输入一个仅由小写字符组成的字符串str,(|str|==n)。其中|str|代表字符串的长度。
输出描述:
输出第k个字符
样例输入
3 2
abc
样例输出
b
说明
关于样例的翻转:

原字符串:abc
翻转并拼接:abccba
翻转并拼接:abccbaabccba
首先以下是我的代码:

#include <iostream>
#include <cstdio>
using namespace std;
int main() {
	int n,k;
	cin>>n>>k;
	getchar();
	char a[n],b[2*n];
	gets(a);
	for(int i=0; i<2*n; i++) {
		if(i<n) {
			b[i]=a[i];
		} else b[i]=a[2*n-1-i];
	}
	int number=(k-1)%(2*n);
	cout << b[number];
	return 0;
}

实际上,思路很简单的这题,就是输入一个数组,然后倒序后拼接成长度增倍的字符串数组,然后寻找第k个字符。唯一值得注意的就是k的值是这样的 (1<=k<=10^18) ,因为后面的字符串都是以拼接后的数组重复的,那么要想得到那个数对其求余就好。
拼接数组也有两种做法
第一种就是,像我这样的,定义两个数组然后,找到规律进行来回赋值。
第二种就是借助拼接反转函数 reverse(a.begin(), a.end());

reverse()函数可以对字符串进行反转操作,头文件是#include
容器类型的要用begin()和end()来指定反转的区域,数组类型的直接用int类型即可。

样例用法:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    string s="hello";
    reverse(s.begin(),s.end());
    char c[]="hello";
    reverse(c,c+strlen(c));
    char x[6]={'h','e','l','l','o'};
    reverse(x,x+strlen(x));
    char str[11];
    for(int i=0;i<5;i++)cin>>str[i];
    reverse(str,str+5);
    cout<<s<<endl;
    cout<<c<<endl;
    cout<<x<<endl;
    for(int i=0;i<5;i++)cout<<str[i];
    return 0;
}

输入"hello"后的输出结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/BUN_P/article/details/103449082
今日推荐