[Gym - 101064F Metal detector] 递推
题目链接:[Gym - 101064F Metal detector]
题意描述:有N个人排队,第一个人出队,第二个人调到队尾,第三个人出队,第四个人调到队尾,……依次类推,求第K个人是第几个出队的。
解题思路:今天组队赛的时候SB了,推了好久,没有搞出来。卡在这么个水题上。
当K是奇数的时候, 毫无疑问,答案就是
考虑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;
}
来源:CSDN
作者:Xingw-Xiong
链接:https://blog.csdn.net/ACMore_Xiong/article/details/52318861