• 约瑟夫问题变形 And Then There was One, LA 3882 递推 动态规划


    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31134#problem/B

    问题的大意是有n个数编号依次为1~n构成一个圈,第一次去掉编号为m的数字,以后没数到k把该数字去掉,问最后剩下什么数字。

    此题的解法是动态规划,递推。标准的约瑟夫问题是0~n-1的n个数从零开始,每数到k就把该数字去掉,随后剩下什么数字。

    我们可以将该题化为标准的约瑟夫问题。假设有n个数字的标准约瑟夫问题,编号为0~n-1,第一次去掉的数字是(k-1)%n,则剩下的数字是 k%n, k%n+1 n%k+2,...,n-1,,,,k%n-2

    我们作如下转换 设 k%n=a,则有 a,a+1,a+2,。。。,n-1,0,1,2,3,。。。,a-2。 a->0, a+1->1, a+2->2, a+3->3,..., a-2->n-2. 变换的公式是 f(x)=(x+k)%n则问题转化成了规模为n-1的标准约瑟夫问题。由于问题的特殊性,本题在最后一次变化的时候是数到m因此在计算最后一次的时候,要把m赋值给k再计算。代码如下。

    #include<iostream>
    using namespace std;
    #define MAXN 100001
    int f[MAXN];
    int main()
    {
    	int n,k,m;
    	while(cin>>n>>k>>m)
    	{
    	   if(n==0&&k==0&&m==0)break;
                f[1]=0;
    	    for(int i=2;i<=n-1;i++)
    	    {
    		    f[i]=(f[i-1]+k)%i;
    	    }
    	    f[n]=(f[n-1]+m)%n+1;
    	    cout<<f[n]<<endl;
    	}
    }
    
    
    


     

  • 相关阅读:
    discuz制作
    Cookie和Session专题
    ecmall二次开发 直接实例化mysql对象
    ecmall widgets 挂件开发详解
    都是iconv惹的祸
    discuz+ecmall+phpcms整合
    replace into
    权限管理设计二
    权限管理设计一
    SVN服务器搭建和使用(二)
  • 原文地址:https://www.cnblogs.com/jackwuyongxing/p/3366476.html
Copyright © 2020-2023  润新知