天天看点

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

这个题我虽然做出来了,但是却是超时,而且超了很多,迷茫了很久后决定百度一下,却只百度到了一个打表法,就是先算出来数,然后在输出,这也太无耻了吧!竟然还有这种方法,真是郁闷!//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