ALGO-973 唯一的傻子 藍橋杯解題
阿新 • • 發佈:2021-09-16
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; }