HDU:1443Joseph(一个超级无耻的…

本文分享了一种解决HDU 1443题目中出现的超时问题的方法,通过预计算结果并存储的方式显著提高了运行效率。文章详细介绍了使用链表实现Josephus问题的代码细节,并探讨了打表法作为一种有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题我虽然做出来了,但是却是超时,而且超了很多,迷茫了很久后决定百度一下,却只百度到了一个打表法,就是先算出来数,然后在输出,这也太无耻了吧!竟然还有这种方法,真是郁闷!//0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,0

http://acm.hdu.edu.cn/showproblem.php?pid=1443

附带下我的代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct people{
 int data;
 struct people *next;
}lnode,*linklist;
int t=sizeof(lnode);
linklist creat(linklist head,int n)
{
 linklist p,s;
 int i;
 head=(linklist)malloc(t);
 head->data=1;
 head->next=head;
 p=head;
 for(i=2;i<=n;i++)
 {
  s=(linklist)malloc(t);
  s->data=i;
  p->next=s;
  p=s;
 }
 p->next=head;
 return head;
}
int count(linklist head,int m,int n)
{
 linklist p,q;
 int count=1,num=n;
 p=head;
 while(p->next!=p)
 
  if(count==m-1)
  {
   q=p->next;
   if(q->data<=n)
    return 0;
   p->next=q->next;
   p=p->next;
   free(q);
   num--;
   if(num==0)
    return 1;
   count=1;
  }
  else{
  count++;
  p=p->next;
  }
 }
 return 1;
}
int main()
{
 int n,i,flag;
 int a[15]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,0};
 linklist head;
 while(scanf("%d",&n),n!=0)
 {
  if(n>=1){
   printf("%d\n",a[n]);
   continue;
  }
  for(i=n+1;i<500000;i++)
  {
   head=creat(head,n*2);
   flag=count(head,i,n);
   if(flag==1)
   {
    printf("%d\n",i);
    break;
   }
  }
 }
 return 0;
}
//0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值