• BZOJ 1012 最大数maxnumber


           题目简单,理解没问题,单用暴力也能得不少分数。因此方法很多,最容易想的是在暴力上优化,用二分的方式也能过,但方法还是略麻烦,所以要用到单调队列、单调栈。在这里我用的是单调队列。

           根据题目可知,进行的操作只有两个,一个增加数,一个输出最大值。因此首先要有一个数组记录当前的队列,然后需要一个单调队列记录最大值,便于查找最大值时的简便。对于什么是单调栈,在这里简单举一例说明:若有一列数 1,5,6,2,4,3,1。将其进行单调递减的排列,则:一个数时——1,两个数时——5,三个数时——6,四个数时——6,2,五个数时——6,4,六个数时——6,4,3,七个数时——6,4,3,1。题目中的一些细节注意一下就能A啦。

           方法很多,视情况而定,如有不懂单调栈、单调队列的查百度。(地址:http://baike.baidu.com/link?url=u4hRLKsFmBCcIldHxh6cqy8qGsGJhs68nI9k_d3nxL3lEBTX_LWyosNHbcjO-JGJ_L4S6EW3Wn6Qvet54dEeHqhttp://baike.baidu.com/link?url=6gqFWC4raDbhkACSHIZTbEwz7rTjXQs__Pnq23m835Qv2EkgI1Y1--LX1ouD2T6NzVnOykiNYhCvsuwoJAXnJq

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<string>
    
    using namespace std;
    
    int i_caozuo,i_mo;//操作数,取模的值。 
    int i_shuzu[200001],i_temp,i_max[200001];//数组中的数,存进的数量,单调队列(递减) 
    int i_last=0,i_shuru;//上次计算的结果,输入的值。 
    char i_panduan[1];//输入的判断字符。 
    int main()
    {
        scanf("%d%d", &i_caozuo, &i_mo);//输入操作数及模。 
        while (i_caozuo--)//用while循环进行每次操作。 
        {
            scanf("%s%d",q,&i_shuru);//数组操作判断及数值。 
            if(i_panduan[0]=='A')//若判断为'A',则进行数组的增加操作。 
           {
                i_shuzu[++i_temp]=(i_last+i_shuru)%i_mo;//就新增加的值。 
                for(int i=i_temp;i;i--)
               {
                   if(i_max[i]<i_shuzu[i_temp])i_max[i]=i_shuzu[i_temp];
                  //单调队列进行判断使max数组始终单调减。
                   else break;
               }
           }
           else printf("%d
    ",i_last=i_max[i_temp-i_shuru+1]);
           //若判断为'Q',则进行输出操作。同时记录本次输出值。 
    }
        return 0;
    }

  • 相关阅读:
    C#匿名类型
    C#中实例Singleton
    Unity Pitfall 汇总
    Unity快捷键
    System.Object
    ExecuteInEditMode
    preview放大镜
    判断当前Selection是否为prefab
    AddComponentMenu
    MenuItem属性
  • 原文地址:https://www.cnblogs.com/szy-wlxy/p/4620147.html
Copyright © 2020-2023  润新知