P3612 [USACO17JAN] Secret Cow Code S
1.P1928 外星密码
2.P3612 [USACO17JAN] Secret Cow Code S
3.P1259 黑白棋子的移动(函数预处理)4.P1010 [NOIP1998 普及组] 幂次方(十进制转二进制)(递归)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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?