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\n",time+1);ok=1; }//如果你在第一位且可以移除,那么游戏结束。使用ok变量来跳出循环
else
{
for(int i=1;i<n;i++)
{
que[i-1]=que[i];
}
time++;
n--;
p--;
}
}
}
}
return 0;
}
当我们不知道循环的次数,只知道循环的跳出条件时,我们应当选择使用while语句。
posted on 2013-07-29 10:49 plank george 阅读(284) 评论(0) 编辑 收藏 举报