您的位置:首页 > 产品设计 > UI/UE

UVA 133 The Dole Queue

2016-07-15 20:36 411 查看

UVA-133

题意:n个人逆时针编号围成一个圈,两个考官一个从1逆时针点人,每次点k个,另一个从n顺时针点人,每次点m个,当被点到的人不同时输出 a b,同一个人时输出 a,每个数字占三个场宽。

解题思路:暴力模拟。直接用循环跑的话在跑到0的时候把数字改成1,跑到n+1把数字改成1就好了。我是写双向链表处理。

/*************************************************************************
> File Name: UVA-133.cpp
> Author: Narsh
>
> Created Time: 2016年07月15日 星期五 16时29分34秒
************************************************************************/

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
int next,bef;
} w[300];
int n,m,k,a,b,num,cnta,cntb;
int ln[30],l;
bool t[60];
int main () {
while (scanf("%d%d%d",&n,&k,&m) && n+m+k) {
for (int i = 1; i <= n; i++) {
w[i].next=i+1;
w[i].bef=i-1;
}
w[1].bef=n;
w
.next=1;
num=0;
memset(t,true,sizeof(t));
a=n;
b=1;
num=l=0;
while (num < n) {
for (int i = 1; i <= k; i++) a=w[a].next;
for (int i = 1; i <= m; i++) b=w[b].bef;
if (b == a) {
ln[++l] =a;
num++;
w[w[a].bef].next = w[a].next;
w[w[a].next].bef = w[a].bef;
printf("%3d",a);
if (num != n) printf(",");
}else {
w[w[a].bef].next = w[a].next;
w[w[a].next].bef = w[a].bef;
w[w[b].bef].next = w[b].next;
w[w[b].next].bef = w[b].bef;
if (w[b].bef == a) w[b].bef = w[a].bef;
if (w[b].next == a) w[b].next = w[a].next;
if (w[a].bef == b) w[a].bef = w[b].bef;
if (w[a].next == b) w[a].next = w[b].next;
printf("%3d%3d",a,b);
num+=2;
if (num != n ) printf(",");
}
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: