And Then There Was One POJ - 3517(变形约瑟夫环+规律)
題意:
約瑟夫問題的變式。先指定第m個(gè)人必須死,然后每隔k個(gè)人死一個(gè)。求最后那個(gè)死的人的編號(hào)是什么。
題目
Let’s play a stone removing game.
Initially, n stones are arranged on a circle and numbered 1, …, n clockwise (Figure 1). You are also given two numbers k and m. From this state, remove stones one by one following the rules explained below, until only one remains. In step 1, remove stone m. In step 2, locate the k-th next stone clockwise from m and remove it. In subsequent steps, start from the slot of the stone removed in the last step, make k hops clockwise on the remaining stones and remove the one you reach. In other words, skip (k ? 1) remaining stones clockwise and remove the next one. Repeat this until only one stone is left and answer its number. For example, the answer for the case n = 8, k = 5, m = 3 is 1, as shown in Figure 1.
Initial state: Eight stones are arranged on a circle.
Step 1: Stone 3 is removed since m = 3.
Step 2: You start from the slot that was occupied by stone 3. You skip four stones 4, 5, 6 and 7 (since k = 5), and remove the next one, which is 8.
Step 3: You skip stones 1, 2, 4 and 5, and thus remove 6. Note that you only count stones that are still on the circle and ignore those already removed. Stone 3 is ignored in this case.
Steps 4–7: You continue until only one stone is left. Notice that in later steps when only a few stones remain, the same stone may be skipped multiple times. For example, stones 1 and 4 are skipped twice in step 7.
Final State: Finally, only one stone, 1, is on the circle. This is the final state, so the answer is 1.
Input
The input consists of multiple datasets each of which is formatted as follows.
n k m
The last dataset is followed by a line containing three zeros. Numbers in a line are separated by a single space. A dataset satisfies the following conditions.
2 ≤ n ≤ 10000, 1 ≤ k ≤ 10000, 1 ≤ m ≤ n
The number of datasets is less than 100.
Output
For each dataset, output a line containing the stone number left in the final state. No extra characters such as spaces should appear in the output.
Sample Input
8 5 3
100 9999 98
10000 10000 10000
0 0 0
Sample Output
1
93
2019
分析
首先不考慮第一個(gè)必須死的人是m的情況。我們把n個(gè)人編號(hào)為[0,n-1]。那么第一輪出局的就是編號(hào)為k-1的人,剩下的人的編號(hào)是[0,k?2]∪[k,n?1]。然后我們從編號(hào)為k的人開始,循環(huán)一圈給所有人重新分配編號(hào)
0----->i
1----->i+1
2----->i+2
… …
k-2----->n-2
k-1(殺死)
k----->0///倒推,從這里最容易看出來dp[i]=(dp[i-1]+k)%i;(此時(shí)i==n)
k+1----->1
… …
n-2----->i-2
n-1----->i-1
其實(shí)這個(gè)問題就是問如何用存活者在i-1個(gè)人中的編號(hào)求出存活者在i個(gè)人中的編號(hào)。我們知道,從原問題推到子問題其實(shí)是把所有人的編號(hào)-k,那么從子問題推到原問題就是把人的編號(hào)+k,但要注意,此時(shí)+k可能會(huì)大于當(dāng)前人的規(guī)模i,所以要對(duì)i取膜。
AC代碼
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int M=1e4+10; int dp[M]; int n,m,k;int main() {while(~scanf("%d%d%d",&n,&k,&m)&&(m||n||k)){memset(dp,0,sizeof(dp));for(int i=2;i<n;i++)dp[i]=(dp[i-1]+k)%i;dp[n]=(dp[n-1]+m)%n;printf("%d\n",dp[n]+1);}return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的And Then There Was One POJ - 3517(变形约瑟夫环+规律)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 山楂条的功效与作用、禁忌和食用方法
- 下一篇: Long Path CodeForces