由于题目数据量很小,所以暴力搜索即可。
先打表,每次开枪前,都要标记好人的起始位置和终止位置,判断是否在好人的位置范围内开枪,详细见注释。
#include <iostream>
using namespace std;
//判断圆圈中有n个好人和n个坏人,每隔m人开一枪,是否能先处决完所有坏人
int check(int n, int m)
{
int st = 0, ed = n - 1; //好人的起始位置和终止位置
int kill; //开枪的位置
for (int i = 2 * n; i > n; i--) //开枪n次,判断能否不处决任何一个好人
{
kill = (m - 1) % i;
if (kill >= st && kill <= ed) //在好人的位置范围内开枪
{
return false;
}
else if (st > kill) //好人的位置在开枪的位置之后
{
st = st - kill - 1;
ed = ed - kill - 1;
}
else //好人的位置在开枪的位置之前
{
st = st + i - kill - 1;
ed = ed + i - kill - 1;
}
}
return true;
}
int main()
{
int num[20];
for (int i = 1; i < 14; i++) //打表
{
int k = 1;
while (check(i, k) == false)
{
++k;
}
num[i] = k;
}
int n;
while (cin >> n)
{
if (n == 0)
break;
cout << num[n] << endl;
}
return 0;
}
继续加油。