【题解】StarryCoding P257 云烟清子的K是啥

前言

题目描述

云烟清子不是个墨守成规的人,他对事物的现状,尤其是对自然数(自然数是正整数)的顺序感到不满。所以,云烟清子决定重新排列它们。但是自然数太多了,所以云烟清子决定重新构造个序列。他写下了以下数字序列:首先是所有 奇数 整数,从 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 (1T1000) - 测试用例的数量。

每个测试用例仅为一行,包含 2 2 2 个正整数 n , k   (   1 ≤ n , k ≤ 1 0 12 ) n, k \ (\ 1 \le n, k \le10 ^ {12}) n,k ( 1n,k1012)

输出格式

打印出由云烟清子构造的序列下标 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 (kmid)×2
  • 如果 k k k 在奇数范围内,答案 a n s ans ans 即为 2 × k − 1 2 \times k - 1 2×k1

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;
}

创作不易,有更好的见解欢迎留言!

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值