题意是:把整数划分成若干个组,每个组内的最大数拿出来,其他的名次相同。 对拿出来的继续分组比较。
注意,题目明确表示给定的整数各不相同。
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct{
int rank;
int value;
}Node;
Node array[100000];
bool cmp(int x, int y)
{
return array[x].value > array[y].value;
}
int main()
{
int np, ng, x;
scanf("%d %d", &np, &ng);
for(int i=0;i < np; i++)
scanf("%d", &array[i].value);
vector<int>ans, tmp;
for(int i=0; i<np; i++)
{
scanf("%d", &x);
ans.push_back(x);
}
while(ans.size() > 1)
{
x = ans.size() / ng + 1;
if(ans.size() % ng != 0) x ++ ;
int start = 0, end = start + ng;
while(start < ans.size())
{
end = start + ng;
if(end > ans.size()) end = ans.size();
sort(ans.begin()+start, ans.begin()+end, cmp);
tmp.push_back(ans[start]);
for(int i=start+1;i<end;i++)
{
array[ans[i]].rank = x;
}
start = end;
}
ans = tmp;
tmp.clear();
}
array[ans[0]].rank = 1;
printf("%d", array[0].rank);
for(int i=1; i<np; i++) printf(" %d", array[i].rank);
printf("\n");
return 0;
}