一道关于杀猪的面试题
2012-04-14 18:33
211 查看
题目:假设有n头待宰的猪,杀猪的人比较变态,他会先杀单数位置上的猪,一次杀完之后,将剩下的猪按照原来的相对位置,又从1开始排列,接着宰单数位置上的猪,直到最后杀完为止。那里有压迫哪里就有反抗,有这么变态的屠夫,就有非常聪明的猪猪。问题是最聪明的猪会站在什么位置,才能保证最后一个被宰?
解这道题目的思路跟约瑟夫环有点类似:
首先在只有一头猪的时候,最后被宰的猪的位置肯定为1;
接着递推,假设在n=m的时候,这头猪的位置(最后一头被宰的)为k。那么,在n = 2 * m(因为每次要杀掉差不多一半的猪)的时候,它的位置应该是2*k。
一直晚上推,直到n为指定猪的数目。
举个例子,假设总共有5头猪:
1, 2, 3, 4, 5 ---> 2, 4 ----> 1, 2 ---> 2 ---> 1
测试代码
解这道题目的思路跟约瑟夫环有点类似:
首先在只有一头猪的时候,最后被宰的猪的位置肯定为1;
接着递推,假设在n=m的时候,这头猪的位置(最后一头被宰的)为k。那么,在n = 2 * m(因为每次要杀掉差不多一半的猪)的时候,它的位置应该是2*k。
一直晚上推,直到n为指定猪的数目。
unsigned int getLastPig(unsigned int n) { if(1 >= n) return 1; unsigned int res(1); for(unsigned int nb(2); nb <= n; nb <<= 1) { res <<= 1; } return res; }
举个例子,假设总共有5头猪:
1, 2, 3, 4, 5 ---> 2, 4 ----> 1, 2 ---> 2 ---> 1
测试代码
int main(int argc, char** argv) { for(unsigned int n = 1; n < 10; ++n) { std::cout << getLastPig(n) << std::endl; } return 0; }
相关文章推荐
- 关于华为一道面试题 ( ++a )和( a++ )
- 今天做到一道面试题:Android开发关于ANR问题
- 一道腾讯的面试题,关于a和&a
- 百度的一道面试题(关于Cache的)
- 一道sql 关于pivot的面试题
- 华为面试题——一道关于指针方面的编程题(C/C++)
- 一道关于实例化顺序的C#面试题
- 关于正则表达式的一道面试题
- 一道关于位段及大小端的面试题
- 关于一道PHP面试题的解法
- Thinking in java中关于Exception的一道面试题.
- 一道关于静态构造函数与抽象类构造函数的面试题引发的思考
- 一道前端面试题,关于函数声明和函数表达式
- 关于一道微软面试题(据称)“飞机问题”详细解答
- MySQL之一道关于GROUP BY的经典面试题
- 关于 parseInt 的一道有意思的面试题
- 一道百度面试题,关于海量数据处理,你有更好的方法吗?
- 一道关于PHP类型转换的面试题
- 关于一道面试题,使用C#实现字符串反转算法
- 关于ThreadLocal的一道面试题(酷我公司)