集合的第N大元素
Time Limit:10000MS Memory Limit:165536K
Total Submit:170 Accepted:107
Case Time Limit:1000MS
Description
有一个集合满足下面的关系:
1)1属于该集合;
2)如果x属于该集合,则2x+1和3x+1也属于该集合;
3)集合中再无其它的元素。
请你求出集合的前n小的元素。
Input
一个整数N(N<=200000)
Output
一行,N个不同的整数,由小到大排列,用空格间隔
Sample Input
5
Sample Output
1 3 4 7 9
此题为单调队列,开两个队列分别记录2x+1 3x+1的结果并在从1到n循环的过程中依次输出x,具体看下面代码
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int n;
queue<int>b,c;
int main(){
scanf("%d",&n);
int x=1;
for(int i=1;i<=n;i++){
printf("%d ",x);
b.push(2*x+1);
c.push(3*x+1);
if(b.front()<c.front()){//从这里开始往下维护x的单调性
x=b.front();
b.pop();
}
else {
x=c.front();
c.pop();
}
if(b.front()==x)b.pop();
}
}