hdu 1443 Joseph

题目链接: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.....

转载于:https://www.cnblogs.com/xurenwen/p/3875022.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值