zoukankan      html  css  js  c++  java
  • [poj1012]Joseph_Joseph

    Joseph

        题目大意:给你2*k个人,前k个是好人,后k个是坏人,编号从1到2*k。每次从上一个死掉的人的下一个开始查m个人并将第m个人杀死。问最后剩下的全是好人的m是多少。

        注释:$1le k le 14$。

          想法:开始觉得自己想的有些简单,然后发现其实就是这码事。dp。

            dp状态:ans[i]表示第i个死的人

            转移方程:类似于Joseph问题,我们在递推时不断更改m的值,最终使得答案成立。

        最后,附上 丑陋的代码... ...

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int ans[30];
    int Joseph[15];
    // int Joseph[]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,1245064};//表
    int main()
    {
    	int k;
    	while(1)
    	{
    		scanf("%d",&k);
    		if(!k) break;
    		if(Joseph[k])
    		{
    			continue;
    		}
    		memset(ans,0,sizeof ans);
    		int n=2*k;
    		int m=k+1;
    		for(int i=1;i<=k;i++)
    		{
    			ans[i]=(ans[i-1]+m-1)%(n-i+1);
    			if(ans[i]<k)
    			{
    				i=0;
    				m++;
    			}
    		}
    		Joseph[k]=m;
    		printf("%d
    ",m);
    	}
    	return 0;
    }
    

         小结:有趣qwq

  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/ShuraK/p/8661653.html
Copyright © 2011-2022 走看看