UVa OJ The Dole Queue 救济金发放 133
题目大意:
给定一个整数 N ,然后逆时针排列从 1 到 N ,然后给定两个整数 k 和 m ,顺时针从 1 数到 k,选定这个数(假设为 w),逆时针(从N)开始,然后数 m 个数,选定这个数为(f),若 w 不等于 f,则将这两个数输出,并且 w 在前,若 w 等于 f,则只输出 其中的一个。输出后,删除这两个数,在这之后各自又从下一个数开始数 k 和 m 个数;如此循环,直到这 N 个数完全被输出。
解题思路:
使用双向链表。AC代码如下,仅供参考。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<deque>
#define MAXN 20
using namespace std;
typedef struct node{
int value;
struct node *former,*laster;
}NODE;
NODE* newnode(){
NODE* u=(NODE*)malloc(sizeof(NODE));
if(u!=NULL){
u->value=0;
u->former=u->laster=NULL;
}
return u;
}
int main(){
#ifdef LOCAL
freopen("133_input.txt","r",stdin);
freopen("133_output.txt","w",stdout);
#endif
int N,k,m;
NODE* t[MAXN];
while(~scanf("%d%d%d",&N,&k,&m)){
if(N==0&&k==0&&m==0)
break;
for(int i=1;i<=N;i++)
t[i]=newnode();
for(int i=1;i<=N;i++){
t[i]->value=i;
if(i==1)
t[i]->former=t[N];
else
t[i]->former=t[i-1];
if(i==N)
t[i]->laster=t[1];
else
t[i]->laster=t[i+1];
}
NODE *fp=t[1],*bp=t[N];
while(fp!=NULL){
for(int i=0;i<k-1;i++)
fp=fp->laster;
for(int i=0;i<m-1;i++)
bp=bp->former;
NODE *tmp1=fp,*tmp2=bp;
if(fp->value==bp->value){
printf("%3d",fp->value);
if(fp->laster->value==fp->value){
free(tmp1);
fp=bp=NULL;
}
else{
fp=fp->laster;
bp=bp->former;
tmp1->former->laster=tmp1->laster;
tmp1->laster->former=tmp1->former;
free(tmp1);
}
}
else{
printf("%3d%3d",fp->value,bp->value);
if(fp->laster->laster->value==fp->value){
free(tmp1);
free(tmp2);
fp=bp=NULL;
}
else{
if(fp->laster->value==bp->value){
bp->laster->former=fp->former;
fp->former->laster=bp->laster;
fp=fp->laster->laster;
bp=bp->former->former;
free(tmp1);free(tmp2);
}
else{
fp=fp->laster;
bp=bp->former;
tmp1->former->laster=tmp1->laster;
tmp1->laster->former=tmp1->former;
free(tmp1);
tmp2->former->laster=tmp2->laster;
tmp2->laster->former=tmp2->former;
free(tmp2);
}
}
}
if(fp!=NULL)
printf(",");
}
printf("\n");
}
return 0;
}