zoukankan      html  css  js  c++  java
  • Joseph POJ

      题意:约瑟夫环  初始前k个人后k个人  问m等于多少的时候 后k个先出去

      题解:因为前k个位置是不动的,所以只要考虑每次递推后的位置在不在前面k个就行

      有递推式 ans[i]=(ans[i-1]+m-1)%(n-i-1)  其中i是轮数  ans[i]是i出局的位置 出局后后面的补到前面 也就是i+1轮开始的位置了   m是数多少个出去 

      这里的是从0开始的,而题目是从一开始 ,平移一下即可 只要ans[i] 前K次不落在前K个即可  打表也行

      

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int ans[1005];
     7 int a[3000];
     8 int main(){
     9 int n;
    10 while(cin>>n&&n){
    11   n*=2;
    12   ans[0]=0;
    13   if(a[n/2]){
    14 cout<<a[n/2]<<endl;
    15 continue;
    16   }
    17   for(int i=1;;i++){
    18       int ok=1;
    19       for(int j=1;j<=n/2;j++){
    20           ans[j]=(ans[j-1]+i-1)%(n-j+1);
    21           if(ans[j]<n/2){
    22             ok=0;
    23             break;
    24           }
    25       }
    26       if(ok){
    27         printf("%d
    ",i);
    28         a[n/2]=i;
    29         break;
    30       }
    31   }
    32 }
    33 return 0;
    34 }
  • 相关阅读:
    次小生成树(SST)
    传纸条(scrip)
    动态规划练习5
    动态规划练习4
    整数的lqp拆分
    [HNOI2002]跳蚤
    BZOJ1803: Spoj1487 Query on a tree III
    51nod-1526: 分配笔名
    51nod-1615: 跳跃的杰克
    BZOJ2588: Spoj 10628. Count on a tree
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10261500.html
Copyright © 2011-2022 走看看