前言
- 不知道在本次入门教育赛大家有没有写出这道云烟清子的 K K K 呢?
- 快速食用通道:入门教育赛6B 云烟清子的K是啥丨StarryCoding
题目描述
云烟清子不是个墨守成规的人,他对事物的现状,尤其是对自然数(自然数是正整数)的顺序感到不满。所以,云烟清子决定重新排列它们。但是自然数太多了,所以云烟清子决定重新构造个序列。他写下了以下数字序列:首先是所有 奇数 整数,从 1 1 1 到 n n n (按升序排列),然后是所有 偶数 整数,从 1 1 1 到 n n n (也是按升序排列)。请你帮帮云烟清子找出下标为 k k k 的数字。
输入格式
输入由多个测试用例组成:
一行包含一个整数
T
(
1
≤
T
≤
1000
)
T \ (1 \le T \le 1000)
T (1≤T≤1000) - 测试用例的数量。
每个测试用例仅为一行,包含 2 2 2 个正整数 n , k ( 1 ≤ n , k ≤ 1 0 12 ) n, k \ (\ 1 \le n, k \le10 ^ {12}) n,k ( 1≤n,k≤1012) 。
输出格式
打印出由云烟清子构造的序列下标 k k k 对应的数字。
输入样例
2
10 3
7 7
输出样例
5
6
解释
对于第一组中的第 2 2 2 个样例:云烟清子构造的序列为 [ 1 , 3 , 5 , 7 , 2 , 4 , 6 ] \left [ 1, 3, 5, 7, 2, 4, 6 \right ] [1,3,5,7,2,4,6] , 下标为 k = 7 k = 7 k=7 的数为 6 6 6 。
题解思路
在这个问题中,我们需要理解当我们先写奇数,然后写偶数时,从 1 1 1 到 n n n 的数字是如何重新排列的。
可以先找到奇数偶数的分界 m i d mid mid ,然后:
- 如果 k k k 在偶数范围内,答案 a n s ans ans 即为 ( k − m i d ) × 2 (k - mid) \times 2 (k−mid)×2 ;
- 如果 k k k 在奇数范围内,答案 a n s ans ans 即为 2 × k − 1 2 \times k - 1 2×k−1 。
AC代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
ll n, k; cin >> n >> k;
ll ans = 2 * k - 1 <= n ? 2 * k - 1 : 2 * (k - ((n + 1) >> 1));
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _; cin >> _;
while (_--) solve();
return 0;
}
创作不易,有更好的见解欢迎留言!