
思路:
首先,1属于集合M,x也属于集合M,那么x肯定是大于或者等于1的,然后,2x+1于3x+1也属于集合M,且要求求集合M的元素从小到大排序的第n个元素。那么,必然有2x>3x或2x<=3x的情况,说明2x与3x不能是在同一个数列,所以可以分成两个数列,一个是2x情况的数列,一个是3x情况的数列。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
/**
* Created on 09:05 01/11/2019
* Description:
* 1->M x->M x>=1 2x+1->M 3x+1->M 必须要保证从小到大 2x>3x--> 3x || 2x
*
* @author Weleness
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
int n = sc.nextInt();
long[] m = new long[1000001];
m[1] = 1;//1->M
int p2 = 1, p3 = 1;// x->M x>=1 分为两个数列p2代表2x p3代表3x
if(n<1) {
System.out.println(0);
return;
}
for (int i = 2; i <=n ; i++){
if(2*m[p2]<3*m[p3]){//如果小于
m[i] = 2*m[p2]+1;//将小的元素存进集合M
p2++;//下标往右移动
}
else {//否则
m[i] = 3*m[p3]+1;//将小的元素存入集合M
if(2*m[p2]==3*m[p3]){//判断两个元素会不会相等,如果相等就都往右移动
p2++;
}
p3++;
}
}
System.out.println(m[n]);
}
}

本文介绍了一种双关系递推队列的实现方法,主要关注如何找到集合M中小于或等于某个给定值n的第n个元素。通过分析1, 2x+1, 3x+1之间的关系,将问题分解为两个数列:2x的情况和3x的情况,分别进行递推计算,从而解决排序问题。"
83655196,8050897,逆深度参数化在视觉SLAM中的应用,"['视觉SLAM', '逆深度参数化', '3D重建', '特征点优化', '非线性优化']

6105

被折叠的 条评论
为什么被折叠?



