1. 程式人生 > 其它 >ALGO-973 唯一的傻子 藍橋杯解題

ALGO-973 唯一的傻子 藍橋杯解題

ALGO-973 唯一的傻子

資源限制

時間限制:1.0s 記憶體限制:256.0MB

問題描述

  腿錚找2255有點事,但2255太醜了,所以腿錚不知道他的長相。正愁不知道到如何找他的時候,他突然看見計33班圍成了一個圈在領微積分試卷。計33班有n個人,其中班長編號為0,其餘同學依次按順時針方向編號。
  只聽見計33小導說“x號同學順時針方向往後數的第k個的神犇出列(不包括x號同學),領取滿分試卷!”。剩下的人繼續圍成一個小圈。這樣一個過程持續了n-1次,那麼顯然,最後只剩下了一個人。眾所周知,2255是個大傻子,門門掛科,不符合滿分試卷這一前提條件。通過這樣一個過程,腿錚終於找到了2255並血虐了他。
  求2255的編號是多少。

輸入格式

  第一行一個n,表示計33班的人數。
  接下來n-1行,表示小導說話中的x和k。

輸出格式

  一個數字,表示2255的編號。

樣例輸入

3
1 1
0 1

樣例輸出

0

資料規模和約定

  前90%資料保證n<=10^4.
  前100%資料保證n<=10^6,1<=k<min(當時圈中人數,1000)

分析用連結串列做一個地址等於連結串列下表的環,從而不需要存元素,只需要存地址,然後找到要刪除的元素前一個元素刪掉該元素即可

比如x號同學的地址為x,他的下一個就是ne[x],本來應該有個e去存這個同學叫什麼的,但是既然是先溝通的就不用存這個x了就直接存x的下個人是誰就可以了

時間複雜度為O(n * 1000) 大約要算10^7次, 肯定小於10^8次,所以1s內可以算完

#include <iostream>

using namespace std;

const int N = 1000010;

int L, ne[N], t;//L為當前環的長度,ne連結串列的next指標

void del(int x, int k)
{
    t = x;
    for (int cnt = 0; cnt == k % L; t = ne[t], cnt ++ );//每次遍歷到要刪除的節點的前一個節點
    ne[t] = ne[ne[t]];//當L只有2的時候t為最終留下來的那個節點的地址
    L -- ;
}

int main()
{
    int n;
    scanf("%d", &n);
    L = n;
    for (int i = 0; i < n; i ++ )//初始化環,這裡是形如0->1->2->3->0的一個地址等於元素值的環
    {
        ne[i] = (i + 1) % n;
    }
    for (int i = 1; i < n; i ++ )
    {
        int x, k;
        scanf("%d%d", &x, &k);
        del(x,k);
    }
    cout << t;
    return 0;
}