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

来源:互联网 发布:mysql 压力测试 编辑:程序博客网 时间:2024/05/22 19:57

这个题我虽然做出来了,但是却是超时,而且超了很多,迷茫了很久后决定百度一下,却只百度到了一个打表法,就是先算出来数,然后在输出,这也太无耻了吧!竟然还有这种方法,真是郁闷!//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)
    return0;
   p->next=q->next;
   p=p->next;
   free(q);
   num--;
   if(num==0)
    return1;
   count=1;
  }
  else{
  count++;
  p=p->next;
  }
 }
 return 1;
}
int main()
{
 int n,i,flag;
 inta[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

原创粉丝点击