P3612 [USACO17JAN] Secret Cow Code S

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;
}
posted @   拍手称快  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示