[Gym - 101064F Metal detector] 递推

本文介绍了一种使用递推算法解决特定排队问题的方法。问题要求确定第K个人在特殊排队规则下的出队顺序。通过区分K为奇数和偶数的情况,并进一步分析N为奇数或偶数的不同处理方式,提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[Gym - 101064F Metal detector] 递推

题目链接[Gym - 101064F Metal detector]
题意描述:有N个人排队,第一个人出队,第二个人调到队尾,第三个人出队,第四个人调到队尾,……依次类推,求第K个人是第几个出队的。 1N109
解题思路:今天组队赛的时候SB了,推了好久,没有搞出来。卡在这么个水题上。
当K是奇数的时候, 毫无疑问,答案就是 K2+1 ;
考虑K为偶数的情况:

  • N为偶数:ans(N, K)==>N/2 + ans(N/2, K/2);
  • N为奇数:ans(N, K)==>N/2 + ans(N/2+1, K/2+1); 为什么是这样的呢?是因为本次操作先将N/2个元素出队,然后多余了最后一个元素先不处理,就相当于最后一个元素放在下一次操作里面去,那么下一次操作就相当于要处理N/2+1个数,其他的数字向后移动一位。这个感觉可意会不好言传…
#include <bits/stdc++.h>
using namespace std;

#define FIN             freopen("input.txt","r",stdin)
#define FOUT            freopen("output.txt","w",stdout)

int N, K;
int solve (int n, int k) {
    if (k & 1) return (k >> 1) + 1;
    if (n & 1) {
        return (n >> 1) + solve ( (n >> 1) + 1, (k >> 1) + 1);
    } else {
        return (n >> 1) + solve (n >> 1, k >> 1);
    }
}
int main() {
#ifndef ONLINE_JUDGE
    FIN;
    // FOUT;
#endif // ONLINE_JUDGE
    scanf ("%d", &T);
    while (T--) {
        scanf ("%d %d", &N, &K);
        printf ("%d\n", solve (N, K) );
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值