非常简单的二分题,就是写起来有点烦 175.编码 令phi(W)为字符串W按以下方法编码的结果: 1、如果W长度为1,那么phi(W)就是W 2、设W=w1 w2 …… wN 且 K=N/2 (向下取整) 3、phi(W)=phi(wN wN-1 …… wK+1)+phi(wK wK-1 …… w1) 例如,phi('Ok')='kO',phi('abcd')='cdab'。 你的任务就是找到原字符串W内第q个字符wq在编码后的字符串phi(W)中的位置。 输入 整数N,q(1<=N<=10^9;1<=q<=N),其中N是字符串W的长度 输出 输出wq在编码后的字符串phi(W)中的位置 样例输入 9 4 样例输出 8 #include <iostream> using namespace std; int f(int p_from, int p_to, int d_from, int d_to, int flag, int q) { if(p_from == p_to) return p_from; if(flag == 1) { if(abs(q-d_from) < abs(q-d_to)) return f((p_from+p_to)/2+1, p_to, d_from, (d_from+d_to-1)/2, -flag, q); else return f(p_from, (p_from+p_to)/2, (d_from+d_to-1)/2+1, d_to, -flag, q); } else { if(abs(q-d_to) < abs(q-d_from)) return f((p_from+p_to)/2+1, p_to, (d_from+d_to)/2+1, d_to, -flag, q); else return f(p_from, (p_from+p_to)/2, d_from, (d_from+d_to)/2, -flag, q); } } int main() { int n, q; cin >> n >> q; cout << f(1, n, 1, n, 1, q) << endl; return 0; }