现在的位置: 首页 > 综合 > 正文

1012 Joseph

2014年02月28日 ⁄ 综合 ⁄ 共 1233字 ⁄ 字号 评论关闭

推个公式

由于具体剩下哪几个坏人和问题并没关系

f(a,b,m,pos)表示有a个好人,b个坏人,报数为m,当前处理pos位置

  =false           (pos+m-1)%(k+bad)<k

or=true            b==0

or=f(a,b-1,m,(pos+m-1)%(k+bad) )        else

以下程序是生成提交代码的,由于有很多重复数据,直接打表更快

  1. /**********************************************************************
  2. *       Online Judge   : POJ
  3. *       Problem Title  : Joseph
  4. *       ID             : 1012
  5. *       Date           : 12/9/2008
  6. *       Time           : 16:43:6
  7. *       Computer Name  : EVERLASTING-PC
  8. ***********************************************************************/
  9. #include<iostream>
  10. using namespace std;
  11. #define MAXN 14
  12. int n,k,m;
  13. //圈内还有bad个坏人,目前从pos位置开始数
  14. bool OK(int bad,int pos)
  15. {
  16.     if (bad==0)
  17.     {
  18.         return true;
  19.     }
  20.     pos=(pos+m-1)%(k+bad);
  21.     if (pos<k)
  22.     {
  23.         return false;
  24.     }
  25.     else
  26.     {
  27.         return OK(bad-1,pos);
  28.     }
  29. }
  30. int main()
  31. {
  32.     freopen("out_1012.txt","w",stdout);
  33.     cout<<"#include<iostream>/nusing namespace std;/n/n#define MAXN 14/n/nint ans[MAXN]={0";
  34.     for (k=1;k<14;++k)
  35.     {
  36.         for (m=1;;++m)
  37.         {
  38.             if (OK(k,0))
  39.             {
  40.                 cout<<','<<m;
  41.                 break;
  42.             }
  43.         }
  44.     }
  45.     cout<<"};/nint n;/n/nint main()/n{/n    while(cin>>n&&n) cout<<ans[n]<<endl;/n    return 0;/n}/n";
  46.     return 0;
  47. }

抱歉!评论已关闭.