【模板题】【STL】2729:Blah数集——两个指针的单调队列

2729:Blah数集:以a为基的集合Ba定义如下:(1) a是Ba的第一个元素;(2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中;将集合Ba中元素按照升序排列,第N个元素会是多少?

思路:保持两个队列头h1、h2,分别代表产生2h1+1,3*h2+1的点。从两个头结点读取t1和t2,若t1<t2则保持t2不变,意思是下一个3*x+1还是x[h2]产生。如输入1 100,此时h1=h2=1,t1=3,t2=4,t1<t2,所以t1入队,t1++,x中为{1,3},下一次产生2h1+1的元素则为3,此时t1=7,t2=4,则4入队,t2++,x中为{1,3,4},下一次产生3*h2+1的元素为3,继续比较。。。

ps:总是超时,后来逐步排查居然是memset的原因?!求大神告知,为什么加memset会超时啊?

#include<iostream>
#include<string.h>
#define MAX 1000010
using namespace std;
int a,n,que[MAX];
void solve()
{
	int h1=1,h2=1,tail=1,t1,t2;
//	memset(que,0,sizeof(que));加这句话居然会TLE?!!?!
	que[1]=a;
	while(tail<n)
	{
		t1=(que[h1]*2)+1;t2=(que[h2]*3)+1;
		if (t1<t2)
		{
			que[++tail]=t1;
			h1++;
		}
		else if (t1>t2)
		{
			que[++tail]=t2;
			h2++;
		}
		else
		{
			que[++tail]=t1;
			h1++;h2++;
		}
	}
	cout<<que[tail]<<endl;
}
int main()
{
	while(cin>>a>>n)
		solve();
	return 0;
}

 

优先队列会超时:

 

#include<iostream>
#include<queue>
#include<string>
using namespace std;
int a,n;
struct data
{ int val;
  data(int x){ val=x;}
  bool operator < (const data &a)const
  {	  return val>a.val;  }
};
void solve()
{
	priority_queue<data> Q;
	int count=0,x;
	Q.push(data(a));
	while(count<n)
	{
		x=Q.top().val;Q.pop();
		count++;
		Q.push(data(x*2+1));
		Q.push(data(x*3+1));
	}
	cout<<x<<endl;
}
int main()
{
	while(cin>>a>>n)
		solve();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值