P3612 [USACO17JAN] Secret Cow Code S
自我感想
哎,又是一道写不出来的。
完全没有这样的思路,只会笨b模拟只能得40.
解题前应该的思考
通过题目给的数据可以知道纯暴力模拟肯定爆空间。(基本否定正推)
这里根据题目所说的,其实可以知道是一个初字符串通过固定的规律形成新的字符串。(明显需要有一个推导过程使巨大数据一步一步减少)。
这里的思路可以将可能是一个大的n逆推回小n(即比给定字符串长度小的),通过比较关系,就可得到起始的n在给定字符串长度内的位置,就可得到题目所要的。
实现的流程
先处理字符串长度设其为m,使其按题目要求倍增至m<=n<=2*m;
这里用n-m所对应的在m2m的位置对应着m/2m的位置,推导关系,并对m实时更新为次一级字符串长度。
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <iomanip>
using namespace std;
int main() {
string s;
cin >> s;
long long n, num, m;
cin >> n;
m = s.length();
num = m;
while (m < n) {
m *= 2;
}
m /= 2;//寻找满足m<n<2m的值.
while (n > num) {//下面为推导的前后字符串位置所对应的位置关系
if (n == m) {
n = m;
} else if (n - m > 1) {
n = n - m - 1;
} else if (n == m + 1) {
n = m;
}
m /= 2;//更新m使其为次级字符串
}
cout << s[n - 1];
return 0;
}