1.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
约瑟夫问题。(自己敲了半天的代码,发现别人利用规律轻松解决,不由得感慨,学好数学真重要!)
//利用规律
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int result = 0;
for (int i = 2; i <= n; i++)
result = (result + 3) % i;
cout << result+1 << endl;
return 0;
}
//自己的
void t(int n)
{
int i = 0, j = -1, k = -1;
int h;
vector<int> v(n, 0);
i = n;
while (i > 0)
{
h = (j + 1) % n;
if (v[h] == 0) j = h;
else
{
while (v[(j + 1 + v[h]) % n] != 0)
v[h] = v[h] + v[(j + 1 + v[h]) % n];
j = (j + 1 + v[h]) % n;
}
k = (k + 1) % 3;
if (k == 2)
{
i--;
v[j] = 1;
}
}
cout << j + 1 << ' ' ;
}