你以为要用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)