据说在罗马时期 犹太士兵被古罗马士兵包围 于是他们决定集体自杀
自杀的方式是所有的士兵围成一个圆,每个士兵轮流杀掉左边的那个士兵,一直杀到还剩一个,剩下的那个士兵自杀。
其中有一个士兵叫做约瑟夫,其实他想投降,但是他又不敢明说,所以他想成为最后一名士兵,那么他应该站在哪里?
目录:
- 细节讲解
- 暴力思路(懒得写......)
- 简易c++思路+解法
所有n个士兵围成一圈,我们将其序号标为1~n,首先我们可以知道(每轮)偶数号必死,将死的剔除,重新编号(这只是思路),偶数号的又必死。而且我们可以发现,如果人数n位2的次方,那么1号肯定是最后剩下的那个人。
2.暴力思路从1号开始往后循环,且移动方式为k=(k+移动人数)%n,这是为了防止下标越界,用a数组来存编号,初始化就为0,如果第k个被杀,就标为-1。应该循环到只有一个不为-1,输出。
3.c++思路+解法具体思路请看这位up主的 (一定要看!) 你应该站在哪个位置,才能活到最后?_哔哩哔哩_bilibili
上代码
#includeusing namespace std; int main(){ int n,p; cin >> n; for(int i = 0; pow(2,i) <= n; i++) p = i; if(pow(2,p) == n) cout << 1 << endl; else cout << (n-pow(2,p)) * 2 + 1 << endl; return 0; }
先循环找出离n最近并小于n的2的次方,然后先将19=2^4+3中的3跳过,再加一个就是2^4这个集合中的1号!



