您的位置:首页 > 其它

UVA 1394 POJ 3517 And Then There Was One (双向循环链表和递推)

2014-05-11 20:23 381 查看
这题用双向循环链表的时间是O(NK),明显是过不了的,但是为了练练手,还是写了一下

#include <cstdio>
#include <algorithm>
using namespace std;
struct List
{
List* pre;
int value;
List* next;
};
int main(){
int i,j;

int n,k,m;
while(scanf("%d %d %d",&n,&k,&m)){
List *list=new List;
if(k==0 && m==0 && n==0)
break;
list->value=1;
list->next=list;
list->pre=list;
List *start=list;
for(i=2;i<=n;i++){
List *a=new List;
a->value=i;
a->pre=list->pre;
a->next=list;
list->pre->next= a;
list->pre=a;
if(i==m)
start=a;
}
if(n>1){
start->pre->next=start->next;
start->next->pre=start->pre;
List *t=start->next;
printf("%d\n",start->value);
delete start;
start=t;
}
else{
printf("%d\n",start->value);
continue;
}
int s=n-1;
while(s>1){
if(s==2){
printf("%d %d\n",start->value,start->next->value);
}
int temp=k-1;
while(temp--){
start=start->next;
}
start->pre->next=start->next;
start->next->pre=start->pre;
List *t=start->next;
printf("%d\n",start->value);
delete start;
start=t;
s--;
}
printf("%d\n",start->value);
}
return 0;
}

 

 

然后用递推的方式又写了一个,把第一个M去掉,并且把所有的编号减去一个M,在最后再加回去

#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
int i,j;
int n,k,m;
while(scanf("%d %d %d",&n,&k,&m)!=EOF){
if(n==0)
break;
int a[2];
a[0]=0;
int v=0;
for(i=2;i<=n-1;i++){
v=1-v;
a[v]=(a[1-v]+k)%i;
}
printf("%d\n",(a[v]+m)%n+1);
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: