Blah数集(代码中存在错误,求更正)

Checkey_Zerone_01 2019-08-03 01:36:52

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3637 通过数: 1911
【题目描述】
大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下:

(1)a是集合Ba的基,且a是Ba的第一个元素;

(2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中;

(3)没有其他元素在集合Ba中了。

现在小高斯想知道如果将集合Ba中元素按照升序排列,第N个元素会是多少?

【输入】
输入包括很多行,每行输入包括两个数字,集合的基a(1≤a≤50))以及所求元素序号n(1≤n≤1000000)。

【输出】
对于每个输入,输出集合Ba的第n个元素值。

【输入样例】
1 100
28 5437
【输出样例】
418
900585

#include <cstdio>
#include <queue>

using namespace std;

#define maxn 10000
long long ret[maxn];

int main()
{
long long a = 0, n = 0;
int cnt = 0;
while (scanf("%lld%lld", &a, &n) == 2)
{
queue<long long> fir;
queue<long long> sec;
fir.push(a);
for (int i = 0; i < n; i++)
{
if (fir.empty() == true)
{
ret[cnt] = sec.front();
fir.push(2 * sec.front() + 1);
sec.push(3 * sec.front() + 1);
sec.pop();
}
else if (sec.empty() == true)
{
ret[cnt] = fir.front();
fir.push(2 * fir.front() + 1);
sec.push(3 * fir.front() + 1);
fir.pop();
}
else if (fir.front() > sec.front())
{
ret[cnt] = sec.front();
fir.push(2 * sec.front() + 1);
sec.push(3 * sec.front() + 1);
sec.pop();
}
else if (fir.front() < sec.front())
{
ret[cnt] = fir.front();
fir.push(2 * fir.front() + 1);
sec.push(3 * fir.front() + 1);
fir.pop();
}
else if (fir.front() == sec.front())
{
sec.pop();
ret[cnt] = fir.front();
fir.push(2 * fir.front() + 1);
sec.push(3 * fir.front() + 1);
fir.pop();
}
}
cnt++;
}
bool first = true;
for (int i = 0; i < cnt; i++)
{
if (first)
{
first = false;
}
else
{
printf("\n");
}
printf("%lld", ret[i]);
}
return 0;
}



评测结果有两个超内存,两个运行错误
...全文
313 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
双杯献酒 2019-08-04
  • 打赏
  • 举报
回复

#include <stdio.h>

#define  NUM_MAX 1000000

// 算法
struct blash {
	typedef int blash_value;
	unsigned char base_;  // 基数

	blash_value* seq_;               // 计算的缓存数据
	blash_value* seq_next;
	blash_value* two_pos;  // 2*x+1
	blash_value two_val;
	blash_value* tree_pos;  // 3*x+1
	blash_value tree_val;

public:
	blash(){
		base_ = 0;
		seq_ = 0;
	}
	bool make_n(unsigned char base, int n) {
		base_ = base;
		if (seq_ == 0)
		{
			seq_ = new blash_value[NUM_MAX];
		}
		seq_next = seq_;

		blash_value first(base_);
		*seq_next = first;
		++seq_next;
		
		two_pos = seq_;
		two_val = first * 2 + 1;
		tree_pos = seq_;
		tree_val = first * 3 + 1;

		for (int i = 1; i < n; ++i) {
			make_next();
		}
		return true;
	}

	bool make_next() {
		if (two_val == tree_val) {
			*seq_next = two_val;
			++seq_next;
			++two_pos;
			++tree_pos;
			two_val = (*two_pos) * 2 + 1;
			tree_val = (*tree_pos) * 3 + 1;
		}
		else if (two_val < tree_val) {
			*seq_next = two_val;
			++seq_next;
			++two_pos;
			two_val = (*two_pos) * 2 + 1;
		}
		else {
			*seq_next = tree_val;
			++seq_next;
			++tree_pos;
			tree_val = (*tree_pos) * 3 + 1;
		}

		return true;
	}

	void print_n() {
		printf("%d\n", *(seq_next - 1));
	}
};

int main() {

	int a = 0, n = 0;
	blash b1;
	while (scanf("%d%d", &a, &n) == 2)
	{
		b1.make_n(a, n);
		b1.print_n();
	}
	return 0;
}

双杯献酒 2019-08-04
  • 打赏
  • 举报
回复
http://noi.openjudge.cn/ch0304/2729/ 这里给的时间限制是3秒, 为什么本题限制是1秒? 难道是因为现在计算机速度更快了的原因。。。。。
双杯献酒 2019-08-04
  • 打赏
  • 举报
回复
这个算法时间可能会超标。
Italink 2019-08-03
  • 打赏
  • 举报
回复
引用 4 楼 iicup 的回复:

#include <iostream>
#include <list>

// 算法
struct blash {
typedef long long blash_value;
unsigned char base_; // 基数

std::list<blash_value> seq_; // 计算的缓存数据
std::list<blash_value>::iterator two_pos; // 2*x+1
blash_value two_val;
std::list<blash_value>::iterator tree_pos; // 3*x+1
blash_value tree_val;

public:
blash(unsigned char base) : base_(base) {}
bool make_n(int n) {
seq_.clear();
blash_value first(base_);
seq_.push_back(first);
two_pos = seq_.begin();
two_val = first*2+1;
tree_pos = seq_.begin();
tree_val = first*3+1;

for (int i = 1; i < n; ++i) {
make_next();
}
return true;
}

bool make_next() {
if (two_val == tree_val) {
seq_.push_back(two_val);
++two_pos;
++tree_pos;
two_val = (*two_pos)*2+1;
tree_val = (*tree_pos)*3+1;
seq_.pop_front();
} else if (two_val < tree_val) {
seq_.push_back(two_val);
++two_pos;
two_val = (*two_pos)*2+1;
} else {
seq_.push_back(tree_val);
++tree_pos;
tree_val = (*tree_pos)*3+1;
seq_.pop_front();
}

return true;
}

void print_n() {
std::cout <<seq_.back() <<std::endl;
}
};

int main() {
// 1 100
blash b1(1);
b1.make_n(100);
b1.print_n();

// 28 5437
blash b2(28);
b2.make_n(5437);
b2.print_n();

// 50 1000000
blash b3(50);
b3.make_n(1000000);
b3.print_n();

return 0;
}
/*
运行输出:
418
900585
1358539642
*/

啥也不说了,强就一个字!
三(three)
双杯献酒 2019-08-03
  • 打赏
  • 举报
回复


#include <iostream>
#include <list>

// 算法
struct blash {
typedef long long blash_value;
unsigned char base_; // 基数

std::list<blash_value> seq_; // 计算的缓存数据
std::list<blash_value>::iterator two_pos; // 2*x+1
blash_value two_val;
std::list<blash_value>::iterator tree_pos; // 3*x+1
blash_value tree_val;

public:
blash(unsigned char base) : base_(base) {}
bool make_n(int n) {
seq_.clear();
blash_value first(base_);
seq_.push_back(first);
two_pos = seq_.begin();
two_val = first*2+1;
tree_pos = seq_.begin();
tree_val = first*3+1;

for (int i = 1; i < n; ++i) {
make_next();
}
return true;
}

bool make_next() {
if (two_val == tree_val) {
seq_.push_back(two_val);
++two_pos;
++tree_pos;
two_val = (*two_pos)*2+1;
tree_val = (*tree_pos)*3+1;
seq_.pop_front();
} else if (two_val < tree_val) {
seq_.push_back(two_val);
++two_pos;
two_val = (*two_pos)*2+1;
} else {
seq_.push_back(tree_val);
++tree_pos;
tree_val = (*tree_pos)*3+1;
seq_.pop_front();
}

return true;
}

void print_n() {
std::cout <<seq_.back() <<std::endl;
}
};

int main() {
// 1 100
blash b1(1);
b1.make_n(100);
b1.print_n();

// 28 5437
blash b2(28);
b2.make_n(5437);
b2.print_n();

// 50 1000000
blash b3(50);
b3.make_n(1000000);
b3.print_n();

return 0;
}
/*
运行输出:
418
900585
1358539642
*/
双杯献酒 2019-08-03
  • 打赏
  • 举报
回复
2x+1和3x+1 递归计算, 这个是近似一个指数函数, 对于 1≤n≤1000000 这样的规模,
普通的整数类型是不够的, 所以需要将数据用字符串表示, 并且直接在字符串上计算.
Italink 2019-08-03
  • 打赏
  • 举报
回复
这道题按部就班的来做可能不太信吧,不然用优先队列是比较好的办法,但是50 1000000 这样的大数据,不找一下规律可能做不了

#include<iostream>
#include<queue>
using namespace std;
int main() {
long long a, n, tmp;
while (cin >> a >> n) {
priority_queue<long long,vector<long long>,greater<long long>> q;
q.push(a);
while (--n) {
tmp = q.top();
while (!q.empty()&&q.top() == tmp) q.pop(); //去重
q.push(tmp * 2 + 1);
q.push(tmp * 3 + 1);
}
cout << q.top() << endl;
}
return 0;
}
gouyanfen 2019-08-03
  • 打赏
  • 举报
回复
明显,内存超限引起终止运行,就运行错误了,应该是两个内存超限,你对输入没有做有效性检查 a(1≤a≤50)) n(1≤n≤1000000) 这两个你在scanf之后需要验证一次,如果超范围,给出默认值

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧