0
已解决
张岳恒
资深光能
资深光能
#include<iostream>
using namespace std;
int main(){
int a,c=0;
string s;
cin>>a;
while(a!=0){
a--;
if(c==1){
s="o";
c=0;
continue;
}
s="m";
c++;
}
cout<<s;
return 0;
}
80分,一个点TLE,一个WA
原题如下:
题目描述
奶牛Bessie最近在学习字符串操作,它用如下的规则逐一的构造出新的字符串:
S(0) = “moo”
S(1) = S(0) + “m”+ “ooo” + S(0) = “moo” + “m” + “ooo” + “moo” = “moomooomoo”
S(2) = S(1) + “m” + “oooo” + S(1) = “moomooomoo” + “m” + “oooo” + “moomooomoo” = “moomooomoomoooomoomooomoo”
………
Bessie就这样产生字符串,直到最后产生的那个字符串长度不小于读入的整数N才停止。
通过上面观察,可以发现第k个字符串是由:第k-1个字符串 + “m” + (k+2个o) + 第k-1个字符串连接起来的。
现在的问题是:给出一个整数N (1 <= N <= 10^9),问第N个字符是字母‘m’还是‘o’?
输入格式
一个整数N。
输出格式
一个字符,m或者o
输入输出样例
输入 #1复制
11
输出 #1复制
m
说明/提示
样例解释:
由题目所知:字符串S(0)是moo, 现在要求第11个字符,显然字符串S(0)不够长;
同样S(1)的长度是10,也不够长;S(2)的长度是25,够长了,S(2)的第11个字符是m,所以答案就输出m。
张岳恒在2020-03-29 11:17:56追加了内容
改了一下仍是80
这次是两个点MLE
代码:
#include<iostream>
using namespace std;
string a[1000001];
int main(){
a[0]="moo";
int n,i=1;
cin>>n;
while(1){
string tmp="";
for(int j=1;j<=i+2;j++)tmp+="o";
a[i]=a[i-1]+"m"+tmp+a[i-1];
if(n<=a[i].size()){
cout<<a[i][n-1];
break;
}
i++;
}
return 0;
}
@包涵宇
张岳恒在2020-03-29 11:20:35追加了内容
发错了,是这个MLE
#include<iostream>
using namespace std;
string a[1000001];
int main(){
a[0]="moo";
long long n,i=1;
cin>>n;
while(1){
string tmp="";
for(int j=1;j<=i+2;j++)tmp+="o";
a[i]=a[i-1]+"m"+tmp+a[i-1];
if(n<=a[i].size()){
cout<<a[i][n-1];
break;
}
i++;
}
return 0;
}
@包涵宇
0
已采纳
包涵宇
中级天翼
中级天翼
上面都说了,是递归!!!
另外,n<=10^9
所以n是longlong!!!
具体代码:
a[0]="moo";
while(1){
string tmp="";
for(int j=1;j<=i+2;j++)tmp+="o";
a[i]=a[i-1]+"m"+tmp+a[i-1];
if(n<=a[i].size()){
cout<<a[i][n-1];
break;
}
i++;
}
自己试试
0
0
0
0
0