目录
牛客_奇数位丢弃_找规律/模拟
题目解析
C++代码1模拟
C++代码2找规律
Java代码找规律
牛客_奇数位丢弃_找规律/模拟
奇数位丢弃_牛客题霸_牛客网
描述:
对于一个由 0..n 的所有数按升序组成的序列,我们要进行一些筛选,每次我们丢弃去当前所有数字中第奇数位个的数。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。
数据范围: 1≤n≤1000,本题有多组输入
输入描述:
每组数据一行一个数字,为题目中的n(n小于等于1000)。
输出描述:
一行输出最后剩下的数字。
题目解析
通过两个例子的模拟发现,每次起始删除的下标都是 2 的次方。 根据这个规律,找到最后一次删除的起始位置的下标即可。
C++代码1模拟
#include <iostream>
#include <vector>
using namespace std;int main()
{int n = 1;// while(n++ <= 1000)while(cin >> n){vector<int> arr;for(int i = 1; i <= n; i += 2){ arr.push_back(i);}int j = 0;while(arr.size() != 1){if(j < arr.size())arr.erase(arr.begin() + j);j += 1; // 原来+=2的,但删去一个了if(j > arr.size())j = 0;}cout << arr[0] << endl;// cout << n << " " << arr[0] << endl}return 0;
}
C++代码2找规律
#include <iostream>
#include <vector>
using namespace std;int main()
{int n = 1;while(cin >> n){int ret = 1;while(ret - 1 <= n){ret *= 2;}cout << ret / 2 - 1 << endl;}return 0;
}
Java代码找规律
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{public static void main(String[] args) {Scanner in = new Scanner(System.in);while(in.hasNext()){int n = in.nextInt();int ret = 1;while(ret - 1 <= n){ret *= 2;}System.out.println(ret / 2 - 1);}}
}