K 必須根據場上人數來簡化,不然會卡在 40%
#include <iostream>
using namespace std;
int main()
{
int n, k;
while (cin >> n >> k)
{
int k2 = -1, j = 0, k1 = 0, z = 0, die = 0, loc = 0, m = 0;;
long a[101] = { };
for (int i = 0; i < n; i++)
a[i] = i + 1;
m = n;
//這段簡化k
if (k % m == 0) k1 = m;
else k1 = k % m;
for (int i = 0; ; i++)
{
if (loc == n - 1)
{
break;
}
j = i % n;
if (a[j] != 0 && k1 >= 0)
{
k1--;
}
if (k1 == 0)
{
k1 = -1;
a[j] = 0;
die = j;
//由於有人死亡,總人數-1
m--;
//簡化k
if (k % m == 0) k2 = m;
else k2 = k % m;
}
if (a[j] != 0 && k2 >= 0)
{
k2--;
}
if (k2 == 0)
{
k2 = -1;
a[die] = a[j];
a[j] = 0;
loc++;
if (k % m == 0) k1 = m;
else k1 = k % m;
i = die;
continue;
}
}
int win = 0;
for (int z = 0; z < n; z++)
if (a[z] != 0)
{
win = a[z];
}
if ((n - (win - 2)) % n == 0) cout << n << endl;
else cout << (n - (win - 2)) %n<< endl;
}
}
=========
數k下當然不能真的數 k 下,若剩下的人數為 m 人,則只要數 k%m下即可
另外也可以計算出下一個要被殺的位置p及 要埋p的位置 d
一開始我設 p=-1,然後迴圈內就是殺一人p,埋的人d,將d移至p、補d的空位{移位} ...
m=n; //剩下幾人
p=-1;
while( cnt > 1) {
p=(p+k)%cnt; //被殺的人 , 數了k下
d=(p+k+ (k-1)/(cnt-1) )%cnt; // 要埋 p的人 {再數 k下, [但p的位置跳過 不數(k-1)/(cnt-1)] }
...
=========
數k下當然不能真的數 k 下,若剩下的人數為 m 人,則只要數 k%m下即可另外也可以計算出下一個要被殺的位置p及 要埋p的位置 d
一開始我設 p=-1,然後迴圈內就是殺一人p,埋的人d,將d移至p、補d的空位{移位} ...
m=n; //剩下幾人
p=-1;
while( cnt > 1) {
p=(p+k)%cnt; //被殺的人 , 數了k下
d=(p+k+ (k-1)/(cnt-1) )%cnt; // 要埋 p的人 {再數 k下, [但p的位置跳過 不數(k-1)/(cnt-1)] }
...
以上 m應以 cnt 代