《算法竞赛入门经典(第2版)》习题5-7 打印队列 (Printer Queue, ACM/ICPC NWERC 2006, UVa12100)

你以为要用priority_queue,其实用vector就好
AC代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int>s;
vector<int>ss;
int main()
{
    int n=0;
    cin>>n;
    while(n--)
    {
        int n1=0;int n2=0;int t=0;
        s.clear();ss.clear();
        cin>>n1>>t;
        int y=0;
        while(n1--)
        {
            int x=0;
            cin>>x;
            s.push_back(x);
            ss.push_back(y);y++;
        }
        ss[t]=-1;
        while(1)
        {
            int maxn=*max_element(s.begin(),s.end());
            if(maxn==s.front()) {n2++;s.erase(s.begin());ss.erase(ss.begin());}
            else {int b1=s.front();s.erase(s.begin());s.push_back(b1);int b2=ss[0];ss.erase(ss.begin());ss.push_back(b2);}
            if(count(ss.begin(),ss.end(),-1)==0) {cout<<n2<<endl;break;}
        }
    }
    return 0;
}

算法:
1、输入部分:先输入组数,然后输入每组包含的元素个数和被标记的位置,将每组的元素push到s中,设置一个操作组ss,和s进行同样的操作,在ss中对特殊位置的对象进行了赋值-1
2、循环部分:先对vector取最大值,如果最值是第一个元素则删除这个元素,操作时间加一,如果不是,将第一个元素放到最后一个位置,删除第一个元素。
循环中判断操作组ss中被标记的-1在操作中是否还存在,如果-1不存在了就输出结果,跳出循环。

学到的东西:
1、vector中的最大值的提取

int maxn=*max_element(s.begin(),s.end());

2、vector的begin()是一个迭代器,vector的第一个元素可以用s[0]或者s.front()进行提取
3、使用对称操作来应对具有特殊标记的问题
4、利用count函数代替find减少时间

if(count(ss.begin(),ss.end(),-1)==0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值