#21664: 測資太大的問題


panchunhsiang@gmail.com (沒牙)

學校 : 不指定學校
編號 : 123249
來源 : [140.117.248.2]
最後登入時間 :
2020-09-24 13:36:45
b551. 2. 羅馬羅盤 -- 103學年度北二區桃竹苗基區資訊學科能力競賽 | From: [182.235.77.131] | 發表日期 : 2020-07-03 21:03

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;

 

 

}

}

 
#22810: Re:測資太大的問題


es611543 (afa)

學校 : 基隆市私立二信高級中學
編號 : 93767
來源 : [36.227.70.47]
最後登入時間 :
2024-04-19 18:48:23
b551. 2. 羅馬羅盤 -- 103學年度北二區桃竹苗基區資訊學科能力競賽 | From: [118.167.31.3] | 發表日期 : 2020-10-03 22:06


=========
數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)] }
       ...

 
#22811: Re:測資太大的問題


es611543 (afa)

學校 : 基隆市私立二信高級中學
編號 : 93767
來源 : [36.227.70.47]
最後登入時間 :
2024-04-19 18:48:23
b551. 2. 羅馬羅盤 -- 103學年度北二區桃竹苗基區資訊學科能力競賽 | From: [118.167.31.3] | 發表日期 : 2020-10-03 22:07


=========
數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 代

 
ZeroJudge Forum