码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1443 Joseph

时间:2014-07-29 13:46:28      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   代码   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1443

先把神级代码双手奉上....虽然看不懂吧...囧

 1 #include<stdio.h>
 2 
 3 int ans[14]={0};
 4 
 5 int joseph(int k)
 6 {
 7     int cnt,p;
 8     if(ans[k])return ans[k];
 9     for(int i=k+1;;i++)
10     {
11         for(cnt=k<<1,p=0;cnt>k;cnt--)
12         {
13             p=(p+i-1)%cnt;
14             if(p<k)cnt=0;
15         }
16         if(cnt==k)
17         {
18             ans[k]=i;
19             return i;
20         }
21     }
22     return 0;
23 }
24 
25 int main()
26 {
27     int n;
28     while(scanf("%d",&n),n)
29     {
30         printf("%d\n",joseph(n));
31     }
32     return 0;
33 }


再把神奇代码奉上...打表

 

1 #include<stdio.h>
2 
3 int main(){
4  int n,a[14]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
5  while(scanf("%d",&n)&&n) 
6                    printf("%d\n",a[n]);
7  return 0;
8 }

 

再说这几个数是怎么来的.....

#include<iostream>
using namespace std;
typedef struct joseph
{
int next;
int pre;
int cur;
}joseph;
int main()
{
  int k,m,count,total,i,j,rec1,rec2,a[14];
  joseph p[30];
  count=0;
  for(j=1;j<=13;j++)
 {
    for(m=2;count!=j*2;m++)
    {
       for(i=0;i<2*j;i++)
       {
           p[i].cur=i;
           p[i].next=i+1;
           p[i].pre=i-1;
       }
       p[2*j-1].next=p[0].cur;
       p[0].pre=p[2*j-1].cur;                                  //将每个人连成环
       count=0;
       rec1=0;
       total=2*j;
       do
       {
           for(i=1;i<=(m-1)%total;i++)
              {rec1=p[rec1].next;}     //一个一个往后移动,直到不能再移动了 
           rec2=p[rec1].next;
           p[p[rec1].pre].next=rec2;
           p[rec2].pre=p[rec1].pre;                    //删除需要出圈者
           if(p[rec1].cur>=0 && p[rec1].cur<j)  //出圈了好人,跳出该m值的循环
           {
               break;
           }
           else
           {
               rec1=rec2;
               count++;                      //出圈一个坏人计数器加1 
           }
           total--;                                   //出圈一人后总人数记得减一
       }while(count!=j);
       if(count==j)                               //出圈好人前出圈完K个坏人,满足条件
       {
           a[j]=m;
           break;
       }
   }
 }

 while(cin>>k && k)
 {
    cout<<a[k]<<endl;
 }
 return 0;
}


这代码竟然没超时T_T.....

hdu 1443 Joseph,布布扣,bubuko.com

hdu 1443 Joseph

标签:style   blog   http   color   os   io   for   代码   

原文地址:http://www.cnblogs.com/xurenwen/p/3875022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!