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

【模拟】【环形数组】-UVA-133- The Dole Queue

2014-03-02 12:57 686 查看
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=69

题目描述:

1~N个人站成圈,公务猿 A 从1 开始顺时针查过 k 个人,公务猿 B 从N开始逆时针查过 m 个人,他俩查出的人出列(可以是重复的同一个人),把每次出列的人输出来,直到队列中木有人。

解题思路:

看完题就想起了之前例会上学长讲的数组模拟queue功能的方法——循环数组,就是用求余运算来实现,这道题也算是比较简单的。按想法写出来就AC了。

AC代码:

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int arr_1[500],arr_2[500];
bool use[30];

void reset(int n)
{
memset(arr_1,0,sizeof(arr_1));
memset(arr_2,0,sizeof(arr_2));
memset(use,0,sizeof(use));

int i,j;
for(i=1;i<=n;i++)
{
arr_1[i]=i;
}
for(i=1,j=n;i<=n;i++)
{
arr_2[i]=j--;
}
}

void solve(int N,int k,int m)
{
int found,p1,p2,c1,c2,i;
p1=1;p2=1;
found=0;
while(found<N)
{
c1=0;c2=0;
for(;;p1++)
{
if(!use[arr_1[p1]])
c1++;
if(c1==k)
{
found++;
break;
}
if(p1==N)
p1=0;
}
for(;;p2++)
{
if(!use[arr_2[p2]])
c2++;
if(c2==m)
{
if(arr_2[p2]!=arr_1[p1])
found++;
break;
}
if(p2==N)
p2=0;
}
use[arr_1[p1]]=1;
use[arr_2[p2]]=1;
if(arr_1[p1]!=arr_2[p2])
printf("%3d%3d",arr_1[p1],arr_2[p2]);
else
printf("%3d",arr_1[p1]);
if(found<N)
printf(",");
}
printf("\n");
}

int main()
{
int N,k,m;
while(scanf("%d%d%d",&N,&k,&m),N||k||m)
{
reset(N);
solve(N,k,m);
}
return 0;
}

AC截图:



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