[Gym - 101064F Metal detector] 递推

来源:互联网 发布:编程金字塔图案 编辑:程序博客网 时间:2024/05/18 15:55

[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;}
0 0
原创粉丝点击