• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

plank george

人生豪迈,只不过是重头再来。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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  阅读(287)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3