我把我所有要讲的东西都放在注释里啦!!~
C++ 代码
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
vector<int>b;
int main()
{
int n;
scanf("%d",&n);//共有n组数据
while(n--)
{
a.clear();
b.clear();
int pos,k;
scanf("%d%d",&pos,&k);//输入pos标号,以及k个数
for(int i=1;i<=k;i++)
{
int temp;
scanf("%d",&temp);
//在a数组里找到temp值大于等于某个数的位置,即按从小到大的序列插入
//这样不用每次都sort,免得复杂度达到O(n2)超时
a.insert(upper_bound(a.begin(),a.end(),temp),temp);
if(i%2==1)
//当序号为奇数时将该数保存到b数组里
/*第一次做的时候没有b数组,全部插入后在输出的话永远是从小到大输出,
而该题是动态的,即插入的个数到奇数是就要输出,所以每次将到奇数的数进行保存
举例,比如9,8,7,6,5.假如按我第一种做法,最后就会输出5,7,9 但是该题就是
要你输出9,8,7,当你输入9时序号为1是奇数,输出,序号为3是奇数,输出中位数8.
以此类推.*/
b.push_back(a[(i-1)/2]);
}
printf("%d %d\n",pos,k/2+1);//很无脑,输出该例的Pos标号以及奇数的个数
for(int i=0;i<=k/2;i++)
{
if(i%10==0&&i!=0)
printf("\n");//这里i从0开始,所以没有i=0的话就会再次换行,导致wa。
//每10个换一次行
printf("%d ",b[i]);//输出
}
printf("\n");
}
return 0;
//以上完美解决,完工
}