日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【51nod - 1073】约瑟夫环问题模板

發布時間:2023/12/10 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【51nod - 1073】约瑟夫环问题模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題干:

N個人坐成一個圓環(編號為1 - N),從第1個人開始報數,數到K的人出列,后面的人重新從1開始報數。問最后剩下的人的編號。

例如:N = 3,K = 2。2號先出列,然后是1號,最后剩下的是3號。

Input

2個數N和K,表示N個人,數到K出列。(2?<=?N,?K?<=?10^6)

Output

最后剩下的人的編號

Input示例

3?2

Output示例

3

解題報告:

思路: 直接模擬的話O(n*k)的時間復雜度,按照套路來的話這樣的題一般是能找規律的; 我們先將n個人的編號改成0~n-1(別問為什么,套路而已),那么第1次報到號碼為k-1的人出列,圈里還剩下n-1個人 我們對比一下出列前后的編號:出列前: 0, 1, 2, 3, 4, 5, 6, ...k-2, k-1, k... n-1 出列后: n-k+1,..................n-2, , 1... n-k我們可以發現留下的人編號和留下來之前是一一對應的,那么要是能找到對應關系的話問題就迎刃而解了,不過現在數據太多了不好找 (偶就是這里找錯了規律然后只過了樣例),我們接著往下想想... 按照前面的規律,第n次報數時只有一個人,我們給他重新編號為0.前面我們也知道了某一輪某個人的編號和上一輪是對應的,最后留下的人此時的編號為0, 那么只要我們由它上溯并找到它在第一輪時的編號答案就出來了啦~ 我們用f(x)表示最后留下來那個人在第n-x+1輪中的編號(這樣做我們就是由f(1)推f(n),更直觀一些,反之由f(n)推f(1)也是可以的),那么f(n)+1就是 最終答案了啦.很顯然有f(1)=0(因為此時只剩下一個人了嘛),接下來我們需要找到兩輪編號之間的映射關系,這個可以有枚舉k和x得到,這里就不寫枚舉 過程了啦~ 最后我們可以得到公式 f(x)=(f(x-1)+k)%x;

AC代碼:

#include <bits/stdc++.h> using namespace std;int main(void){int gg, n, k;cin >> n >> k;gg=0;for(int i=2; i<=n; i++){gg=(gg+k)%i; //前面說的f(x)只是為了我們更直觀地理解,其實直接用一個變量保存上一輪序號就可以了}cout << gg+1 << endl;return 0; }

轉自https://www.cnblogs.com/geloutingyu/p/6202200.html

總結

以上是生活随笔為你收集整理的【51nod - 1073】约瑟夫环问题模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。