这次的题目用的是截图,我没有它的文档版,只是看这个题目有意思,发一下,自己也练习使用了vector,题目主要的思路就是构建序列+降序排序,题目卡人的地方就是对边界的处理,判断s与序列中元素个数的大小
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define M 20005
int n,m,k,s;
int a[M];
vector<int> v[M];
bool cmp(int a,int b)
{ //sort排序传入的参数,得到降序序列
return a>b;
}
void init()
{
for (int i=1;i<=n;i++)
{
v[i].clear();
v[i].push_back(a[0]);
for (int j=i;j<=n;j+=i)
{
v[i].push_back(a[j]);
}
sort(v[i].begin(),v[i].end(),cmp);
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
scanf("%d",&a[i]);
init();
for (int i=0;i<m;i++)
{
scanf("%d%d",&k,&s);
if (k>=n&&s==1) //如果输入的k比n都大,那么序列中就只有a[0]一个元素了
printf("%d\n",a[0]);
else if (k>=n||v[k].size()<s)
/*对应着不存在的情况,即序列中的元素数小于s*/
printf("-1\n");
else
printf("%d\n",v[k][s-1]);
}
}
return 0;
}
/*
1
5 2
2 5 3 4 1
2 4
2 1
*/