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