codeforces 950D - A Leapfrog in the Array(思维)

题目链接 codeforces 950D

题意:

给出一个n,每个数i 在2*i-1 的位置,每次把最后一个往前面的空格处移动,直到没有空格 ,q次查询,问第x位置的数是多少

题解:

当查询的位置为奇数时, 数字没有移动过,为 (x+1)/ 2

当查询的位置为偶数时,意味着当前位置的前 有 x / 2 个数字没有移动过,然后往后加,直到位置为奇数,最后为(x+1)/ 2 

以 n = 6 举例, 看 6 的移动

初始情况 ① 1 _ 2 _ 3 _ 4 _ 5 _ 6

               ② 1 _ 2 _ 3 _ 4 _ 5 6 

               ③ 1 _ 2 _ 3 _ 4 6 5

               ④ 1 _ 2 _ 3 5 4 6

               ⑤ 1 _ 2 6 3 5 4

               ⑥ 1 4 2 6 3 5

看6 的移动 ,将6 放回原来的位置

      ① 1 4 2 6 3 5            // 6此时在索引4的位置,前面有两个元素没有移动,分别是1 2

     ② 1 _ 2 _ 3 5  4  6          // 6此时应该在索引 8 的位置, 前面有 4 个元素没有移动过,分别是1 2 3 4

     ③ 1 _ 2 _ 3  4   5  6        // 6此时回到初始位置,索引为 13 为奇数,结束

 

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){
	ll n, q;
	cin >> n >> q;
	for(ll i = 1; i <= q; i++){
		ll k;
		cin >> k;
		if(k % 2 == 1){
			cout << (k+1)/2 << endl;     // 奇数
		}
		else{
			while(k % 2 == 0){
				k = k + (n - k/2);        // 偶数,向后挪(n-k/2)个
			}
			cout << (k+1)/2 << endl;
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值