题目的意思很难理解,即将第三排的数作为索引,每三个三个一组,例如6,0,8一组,则19,25,57一组,选出最大的数,又以三个三个一组,以此进行直到得出第一名。依次输出排名。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
using namespace std;
vector<int> v;
int a[1005];
int ans[1005];
int mark[1005];
int mark1[1005];
int main()
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
int tmp;
scanf("%d",&tmp);
v.push_back(tmp);
}
vector<int> vv=v;
v.clear();
while(vv.size()!=1)
{
for(int i=0;i<vv.size();i+=k)
{
if(i+k>=vv.size())
{
int maxx=-1;
int biaoji;
for(int j=i;j<vv.size();j++)
{
if(a[vv[j]]>maxx)
{
maxx=a[vv[j]];
biaoji=vv[j];
}
}
mark[biaoji]=1;
v.push_back(biaoji);
}
else
{
int maxx=-1;
int biaoji;
for(int j=i;j<i+k;j++)
{
if(a[vv[j]]>maxx)
{
maxx=a[vv[j]];
biaoji=vv[j];
}
}
v.push_back(biaoji);
mark[biaoji]=1;
}
}
int len=v.size();
for(int i=0;i<n;i++)
{
if(mark[i]==0)
{
if(mark1[i]==0)
{
ans[i]=len+1;
mark1[i]=1;
}
}
else
{
mark[i]=0;
}
}
vv=v;
v.clear();
}
ans[vv[0]]=1;
printf("%d",ans[0]);
for(int i=1;i<n;i++)
{
printf(" %d",ans[i]);
}
}