zoukankan      html  css  js  c++  java
  • 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语句。

  • 相关阅读:
    NOIP2006代码及简析
    设计模式的原则
    UML应用
    关系
    活动图
    状态图
    UML概序
    UML基本图示
    用例
    介绍一个好的英语学习网站!
  • 原文地址:https://www.cnblogs.com/plank-george-zzo/p/3222442.html
Copyright © 2011-2022 走看看