题目描述:
东东正在玩字符串游戏,他有一个魔法,能对字符串进行操作,他能把字符串的第 iii 个字符串变成 iii 个。
比如,若字符串为"abc",东东施展魔法把字符串变成了"abbccc"。
但是,改完之后,快递员给东东打电话了,东东拿完快递回来发现自己忘记了原来的字符串,现在只有你能帮东东
输入格式
第一行输出一个整数 n(1≤n≤100)n(1 \le n \le 100)n(1≤n≤100),表示这个字符串的长度。
第二行输入东东施展魔法后的字符串。
输出格式
输出东东原来的字符串。
sample:
Sample Input
6
baabbb
Sample Output
bab
Sample Input 2
10
ooopppssss
Sample Output 2
oops
题目分析:
本题陷阱不少,第一次以为是把重复的记录下个数然后减去重复数,结果发现不是那么回事儿,实际上它的变化是原来每个字母都变,实际上变化后字符串中原来字符的位置差就是一个等差序列,1,2,3,4,5。。。。。。当然我们可以用公式实现,但是我老是WA,所以干脆就用手工加法了。
count++;
num++;
sum=sum+count;
然后每次只需要找,看看是字符串的那个位置满足等差序列的前n项和就行了。
if(i+1==sum)
{
a[num]=s[i];
count++;
num++;
sum=sum+count;
}
最后输出的时候要注意,由于循环的结果,这导致最终的结果长度是num-1,所以在for里面要注意边界,多输出会WA。
for(int i=1;i<num;i++)
{
cout<<a[i];
}
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
char a[10010];
int main()
{
int n;
cin>>n;
string s;
cin>>s;
int num=1;
int sum=1;
int count=1;
for(int i=0;s[i]!='\0';i++)
{
if(i+1==sum)
{
a[num]=s[i];
count++;
num++;
sum=sum+count;
}
}
for(int i=1;i<num;i++)
{
cout<<a[i];
}
}