And Then There Was One (约瑟夫环)(动态规划)

版权声明:若有转载,请标注原博客地址!谢谢 https://blog.csdn.net/DreamTrue1101/article/details/83589766

UVA - 1394 原题目链接

题目描述:

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. Figure 1: An example game 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.

解题思路:该题利用动态规划思路解决;

具体实现:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define inf 1e6+5
using namespace std;
typedef long long ll;
int main()
{
    int n,m,k,dp;
    while(~scanf("%d%d%d",&n,&k,&m))
    {
        if(n==0&&m==0&&k==0)
            break;
        dp=0;
        for(int i=2; i<n; i++)
        {
            dp=(dp+k)%i;
        }
        int num=(dp+m+1)%n;
        if(num<=0)
            num+=n;
        printf("%d\n",num);
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/DreamTrue1101/article/details/83589766
one