POJ 3125 Printer Queue

http://poj.org/problem?id=3125

题意十分简单,就是一个队列每个元素都赋给一个值,如果第一个元素比后面都小就去除第一个元素,时间加一,否则把第一个元素移动到最后一位,时间不加;

给出你的位置和此队列,问你被剔除时要用多少时间。

这个题目显然是一个模拟的题:题目都一步步的交代怎么去做了。

我一开始,想到用队列做,可是发现队列难以进行元素比较操作,虽然队列做去头运算十分方便,所以我最终选择了用数组来模拟,这样就可以不管队列的各种函数和访问限制,随心所欲的按照题目进行模拟。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define M 200
#define mem0(f) memset(f,0,sizeof(f))
int t,n,p,v,h,ok,time;
int que[M];
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{

scanf("%d%d",&n,&p);
for(int i=0;i<n;i++)
{
scanf("%d",&que[i]);
}
ok=0;
time=0;
while(!ok)
{
h=0;
for(int k=1;k<n;k++)//此循环是全队列与第一个元素比较,如果有大的就换,break,若全部比完,第一个元素可以去掉
{
if(que[k]>que[0])
{

//全部往前移一位
int temp=que[0];
for(int z=1;z<n;z++)
{
que[z-1]=que[z];
}
que[n-1]=temp;
if(p==0)p=n-1;
else p--;
h=1;
break;
}
}
if(!h)
{
//移除第一位
if(p==0){printf("%d ",time+1);ok=1; }//如果你在第一位且可以移除,那么游戏结束。使用ok变量来跳出循环
else
{
for(int i=1;i<n;i++)
{
que[i-1]=que[i];
}
time++;
n--;
p--;

}
}

}
}
return 0;
}

当我们不知道循环的次数,只知道循环的跳出条件时,我们应当选择使用while语句。

原文地址:https://www.cnblogs.com/plank-george-zzo/p/3222442.html