习题10-23 Hendrie序列 UVa10479

1.题目描述:点击打开链接

2.解题思路:本题是一道找规律题,仔细观察后发现有以下特点:

(1)下标为2^k的数正好为k(下标从1开始)。

(2)如果依次以1,2,4,8...的长度来分解串,可以将序列分解为:0 1 02 1003 02110004 1003020211100005......可以发现,第i个串是由第i-2,i-3,...2,1,0个串组成的。且第i-2个串有1个,第i-3个串有2个,第i-4个串有3个......第1个串有i-2个,第0个串有i-1个,最后再加上数字i。也就是是说,串的构造时递归的。因此可以考虑递归求解。

好了,观察出来上述两个特点后,就可以顺利解决本题了。首先利用第一个性质,将所有的坐标初始化,放到pos数组。由于最高可达2^63,因此应该使用unsigned long long类型。同时初始化第i个串的长度为num[i]。

接下来,每次输入一个n,先查找刚刚大于n的位置pos[i],令len=pos[i]-n,接下来利用第二个特点递归求解,即dfs(len,i)。返回的是len==0时候对应的数字。根据性质2,从第0个串开始考虑(当前考虑的串设为now),如果len超过了i*num[now](i表示第now个串的个数),那么len-=i*num[now],同时now++。这样一直到长度<i*num[now]为止.由于第now个串的构造也是递归的,因此可以递归求解,即dfs(len,now)。不过事先应取模,即len=(len-1)%num[now]。因为我们只考虑len<=num[now]的情况。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

#define maxn 64
typedef unsigned long long ull;
ull pos[maxn], num[maxn];

void init()
{
	num[0] = num[1] = 1;
	for (int i = 2; i < maxn; i++)
		num[i] = num[i - 1] * 2;//num[i]表示第i个串的长度
	pos[1] = 2;
	for (int i = 2; i < maxn; i++)
		pos[i] = pos[i - 1] * 2;//标记i首次出现时的下标(从1开始)
}

int dfs(ull len, int n)
{
	if (len == 0) return n;
	int now = 0;
	for (int i = n - 1; i > 0; i--)
	{
		if (len > i * num[now])
			len -= i * num[now];
		else
		{
			if (now == 0 || now == 1)
				return now;
			len = (len - 1) % num[now];//将len修改为一个num[now]内的长度
			return dfs(len, now);//递归求解
		}
		now++;
	}
}

int main()
{
	//freopen("t.txt", "r", stdin);
	init();
	long long n;
	while (scanf("%lld", &n) == 1 && n)
	{
		if (n == 1)
		{
			printf("0\n");
			continue;
		}
		for (int i = 1; i <= 64; i++)
		{
			if (n <= pos[i]) //先找到刚刚超过n的i
			{
				printf("%d\n", dfs(pos[i] - n, i));//利用dfs求解
				break;
			}
		}
	}
	return 0;
}
时间: 2024-10-09 20:54:29

习题10-23 Hendrie序列 UVa10479的相关文章

数组-10. 求整数序列中出现次数最多的数

数组-10. 求整数序列中出现次数最多的数(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧(浙江大学) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N<=1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3

10.23 linux任务计划cron10.24chkconfig工具10.25 systemd管理服务10.26 unit介绍 10.27 target介绍

- 10.23 linux任务计划cron - 10.24 chkconfig工具 - 10.25 systemd管理服务 - 10.26 unit介绍 - 10.27 target介绍 - 扩展 1. anacron http://blog.csdn.net/strikers1982/article/details/4787226  2. xinetd服(默认机器没有安装这个服务,需要yum install xinetd安装) http://blog.sina.com.cn/s/blog_46

2016.10.23大型在职研究生招生说明会

气温骤降,金秋已值,一年一度的十月攻坚战开始了.伴随着在职研究生新政的颁布,北京地区各大院校在职研究生的新简章轮番更新,给很多准备报考在职研究生的学员带来了各种混乱以及忐忑. 正巧,2016年秋季大型在职研究生招生说明会即将在北京国家图书馆召开.不管你对在职研究生有多少疑问,这次会议都会给你一个完美的解释. 10月23日北京地区大型在职研究生招生说明会有必要去吗?去了以后真的能解决所有疑惑吗? 其实啊,我们在9月17日已经成功举办了一次北京大型在职研究生说明会,通过9.17说明会的完美收官总结一

C语言程序设计教程(第三版)课后习题10.4

1353: C语言程序设计教程(第三版)课后习题10.4 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 296  Solved: 219[Submit][Status][BBS] Description 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. Input 输入数据的个数n n个整数移动的位置m Output 移动后的n个数 Sample Input

问题 1047: C语言程序设计教程(第三版)课后习题10.5

/******************************************************************** @file Main.cpp @date 2017-06-01 12:17:46 @author Zoro_Tiger @brief 问题 1047: C语言程序设计教程(第三版)课后习题10.5 http://www.dotcpp.com/oj/problem1047.html ***************************************

2014.10.23安卓全球开发者大会经历

2014.10.23安卓全球开发者大会经历 by 伍雪颖 2014.10.23 2014安卓全球开发者大会 作为一个程序员,怀着激动的心情,大老远的从深圳南山赶到福田香格里拉酒店,听了一天后其实是很失望地回来的: 1.中国分几个区同时进行,就深圳区是免费入场的,所以深圳区的活动质量是最差的 2.全场在做广告的偏多 3.挂着"安卓全球开发者"的羊头,卖着扯皮的狗肉 4.雷军说好要来的,最后大概意思是深圳都是做广告的,来了没意思 5.说实在的,干货不多 上午赶过去因为半路塞车了,11点多才

问题 1043: C语言程序设计教程(第三版)课后习题10.1

/******************************************************************** @file Main.cpp @date 2017-05-29 12:55:07 @author Zoro_Tiger @brief 问题 1043: C语言程序设计教程(第三版)课后习题10.1 http://www.dotcpp.com/oj/problem1043.html ***************************************

10.23 linux任务计划cron 10.24 chkconfig工具 10.25 system

八周一次课 10.23 linux任务计划cron 10.24 chkconfig工具 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 10.23 linux任务计划cron 10.24 chkconfig工具 显示chkconfig服务 系统启动服务在inittab 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 原文地址:http://blog.51cto.com/wbyyy/2066113

10.23 考试总结

10.23 考试总结 救火行动 不得不说还是想问候一下出题人的,那个白色的字是什么鬼.....不过看到了不要喧哗倒是很有意思 所以就是一个大模拟题.....因为比较麻烦,只不过数据很小,纯模拟循环都可以过的说. 考试的时候没有注意到一个点就是可以直接灭火的时候当前这一轮是不算这层着火的,也就是说第五层的火势应该只涨i-1 稍微注意一下这个就可以了,然后就还好,其余的还是都有好好注意到的 打篮球 这个题目我是考试的时候一下没有相同怎么建图....实际上暴力枚举各种参数就可以了. 然后就是纯最短最长