1.题目描述:点击打开链接
2.解题思路:设第m位元素为x,事先复制队列中的所有元素到数组r,从大到小排序找到所有比x大的元素。接下来把队列看做循环的,模拟整个过程即可。注意:不要试图一步到位。我试过很多方法都是WA,无奈只能模拟题意最终AC。
3.代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cassert>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<cstring>
#include<functional>
using namespace std;
const int maxn = 100 + 10;
int qt[maxn];
int r[maxn];
int cmp(const void*p, const void *q)
{
return *(int*)q - *(int*)p;
}
int find(int v,int x)
{
for (int i = 0; i < v;i++)
if (r[i] == x)
return i;
return v;
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int t;
cin >> t;
while (t--)
{
int n, m;
cin >> n >> m;
memset(qt, 0, sizeof(qt));
memset(r, 0, sizeof(r));
for (int i = 0; i < n; i++)
{
scanf("%d", qt + i);
r[i] = qt[i];
}
qsort(r, n, sizeof(int), cmp);
int time = 0;
int mark = qt[m];
int p = find(n, qt[m]);
int j = 0;
for (int i = 0;; i++)//把队列看做循环的,模拟整个过程
{
i %= n;
if (j<p)
if (qt[i] == r[j])//先找比qt[m]大的元素,一一删除
{
qt[i] = 0;
time++;
j++;
}
if (j == p)//删除完毕,再找和qt[m]一样的元素
{
if (qt[i] == qt[m])
time++;
if (i == m)break; //走到m位置时,停止模拟
}
}
cout << time << endl;
}
return 0;
}