[Gym - 101064F Metal detector] 递推

最后都变了- 提交于 2019-12-08 10:34:16

[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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!