UVa 133-The Dole Queue【シミュレーション】
1426 ワード
原文URL:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=832&page=show_problem&problem=69
本当に酔っ払って、もともと簡単に見える問題は、長い間やらなければならないので、問題があまりにも葛藤しているのか、それとも自分の基礎知識がしっかりしていないのか分からない......
一群の人が1つの輪を囲んで、1つの起点から、時計回りと反時計回りに数を数えて、ある数字を数えたときに停止して、最後の2つの方法で数えた数字は1つか2つあって、それから出力して(繰り返して出力しない)、このような規則的な出隊順序を求めます......
の配列を使ってシミュレーションして、感じは本当に不快です.....奇妙な感じで、最も注意しなければならないのは境界の処理と、出力の下付きと操作の下付きの対応関係です.
書き終わってから気づいたのですが、両端の列でシミュレーションしてみてもいいようで、簡単に酔っ払うはずですが...
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=832&page=show_problem&problem=69
本当に酔っ払って、もともと簡単に見える問題は、長い間やらなければならないので、問題があまりにも葛藤しているのか、それとも自分の基礎知識がしっかりしていないのか分からない......
一群の人が1つの輪を囲んで、1つの起点から、時計回りと反時計回りに数を数えて、ある数字を数えたときに停止して、最後の2つの方法で数えた数字は1つか2つあって、それから出力して(繰り返して出力しない)、このような規則的な出隊順序を求めます......
の配列を使ってシミュレーションして、感じは本当に不快です.....奇妙な感じで、最も注意しなければならないのは境界の処理と、出力の下付きと操作の下付きの対応関係です.
#include<stdio.h>
#include<string.h>
int n,k,m,x[25];
int count(int bg,int turn,int step)//
{
int cnt=0,i=bg;
while(cnt<turn)
{
if(step<0&&i==0)// ,
{
i=n;
}
i+=step;//step
if(x[i%n])
{
++cnt;
}
}
return i%n;//
}
void slove()
{
memset(x,-1,sizeof(x));
int cnt=0,left=-1,right=n;//
while(cnt<n)
{
if(cnt)//
{
printf(",");
}
left=count(left,k,1);//
right=count(right,m,-1);//
printf("%3d",left+1);
x[left]=0;//
++cnt;
if(right!=left)//
{
printf("%3d",right+1);
++cnt;
x[right]=0;
}
}
printf("
");
return ;
}
int main()
{
//freopen("shuju.txt","r",stdin);
while(scanf("%d%d%d",&n,&k,&m),n|m|k)
{
slove();
}
return 0;
}
書き終わってから気づいたのですが、両端の列でシミュレーションしてみてもいいようで、簡単に酔っ払うはずですが...