题目:Blah数集
思路如下:
就一开始来说,我们有一个元素a,我们要把2*a+1和3*a+1加入数集里
注意:这里说的是集合,也就是说里面没有重复的元素,因此我们需要去重
这里用了双指针的思想:
- 创建两个队列q1,q2来分别储存两种方式生成的元素
- 创建两个指针i,j分别指向两个队的队头
- 比较指针指着的两个数,a记录较小数
- 使用a的那个进行生成,然后将其去掉(出队)
- 如果两个数相同,那么任意取一个生成,然后两个都要出队
- 排名统计+1
- 重复3-6直到排名统计到达边界(k<n)
- 输出
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int a,n;
int main(){
while(~scanf("%d%d",&a,&n)){
queue<int> q1,q2;
int k=1;
while(k<n){
q1.push(2*a+1);
q2.push(3*a+1);
if(q1.front()<q2.front()){
a=q1.front();k++;q1.pop();
}
else{
if(q1.front()>q2.front()){
a=q2.front();k++;q2.pop();
}
else{
a=q1.front();k++;q1.pop();q2.pop();
}
}
}
cout<<a<<endl;
}
return 0;
}