国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

圓圈中最后剩下的數字

2019-11-08 03:20:04
字體:
來源:轉載
供稿:網友

題目描述

每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作為牛客的資深元老,自然也準備了一些小游戲。其中,有個游戲是這樣的:首先,讓小朋友們圍成一個大圈。然后,他隨機指定一個數m,讓編號為0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱首歌,然后可以在禮品箱中任意的挑選禮物,并且不再回到圈中,從他的下一個小朋友開始,繼續0…m-1報數….這樣下去….直到剩下最后一個小朋友,可以不用表演,并且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!^_^)。請你試著想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)

經典解法:

我們使用一個數組來模擬這些孩子,當孩子還沒有被挑選到,就設為0,如果孩子被挑出,就設為1,如果已經遍歷到了結尾,就移到數組的開頭,直到最后剩下一個孩子。

創新解法:

在這n個數字中,第一個被刪除的數字是(m - 1)% n,為了簡單起見,我們將其記作k,刪除k之后剩下的n-1個數字為0, 1, 2, 3, … , k -1, k + 1, … , n - 1, 并且下一次刪除從k +1開始計數,但顯然該數列最后剩下的數字也是應該關于n和m的函數,我們將其記作f’(n - 1, m),最初序列剩下的最后一個數字一定是刪除一個數字之后的序列的最后剩下的數字,即f(n, m)= f’(n - 1, m)。 剩下的一個數組序列可以產生這樣的映射: k + 1 -> 0 k + 2 -> 1 … n - 1 -> n - k - 2 0 -> n - k - 1 1 -> n - k … k - 1 -> n - 2 映射定義為p,則p(x) = (x - k - 1) % n,逆映射p^(-1)(x)= (x + k + 1)%n, 映射之后的序列和之前的序列有同樣的形式,所以可以記作f(n - 1, m ),根據我們的映射,映射之前的序列中最后剩下的數字f’(n - 1, m) = p ^(-1)[f(n - 1, m)] = [f(n - 1, m) + k + 1] % n = [f(n - 1, m ) + m] % n = f(n, m).

代碼如下:

public static int LastRemaining_Solution(int n, int m) { if (n <= 0 || m <= 0) { return -1; } int count = n; int[] result = new int[n]; int temp = 0; int i = 0; while (count > 1) { if (i == n) { i = 0; } if (result[i] == 0) { temp++; } if (temp == m) { count--; temp = 0; result[i] = 1; } i++; } int j; for (j = 0; j < n; j++) { if (result[j] == 0) { break; } } return j; } public static int LastRemaining_Solution2(int n, int m) { if (n <= 0 || m <= 0) { return -1; } int last = 0; for (int i = 2; i <= n; i++) { last = (last + m) % i; } return last; }
上一篇:11 單播初體驗

下一篇:順序容器

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂温| 津南区| 寻甸| 策勒县| 汝阳县| 汕尾市| 辉南县| 罗山县| 东平县| 连江县| 兰溪市| 呈贡县| 阿尔山市| 平果县| 阿拉尔市| 荆州市| 忻城县| 江华| 夏河县| 宣武区| 当雄县| 阜南县| 南和县| 内江市| 星座| 建宁县| 颍上县| 沂南县| 宜君县| 玛纳斯县| 金平| 山阴县| 县级市| 驻马店市| 昌吉市| 白水县| 容城县| 辽中县| 岫岩| 朔州市| 苍梧县|