题目理解有些麻烦
遇到的需要解决的点:
1. 名次问题,本轮名次即为下一组人数加一
2. 分组求本组最大 并且将最大的数 留到下一轮里
注:输出的是 按所拿到的重量在这种分组方式下能排到第几,所以还是 1 2 3 4 5 6 …..号输出对应名次, 而不是按分组的第几号(也就是按第二行输入的序号的对应关系来,不是第三行)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int p, g;
vector<int> weight;
vector<int> num;
vector<int> order;
int main(){
scanf("%d%d",&p,&g);
weight.resize(p);
num.resize(p);
order.resize(p);
for(int i=0; i<p; i++)
scanf("%d",&weight[i]);
for(int i=0; i<p; i++)
scanf("%d",&num[i]);
int round = 0;
while(num.size() > 1){
round = num.size()/g + 1;
if(num.size()%g != 0) round = round + 1;
vector<int> next;
next.clear();
int n = 0;
while(n < num.size()){
int max = -1, index = 0;
for(int i=0; i<g&&n<num.size(); ++i,++n){
order[num[n]] = round;
if(weight[num[n]]>max){
max = weight[num[n]];
index = num[n];
}
}
next.push_back(index);
}
num = next;
}
order[num[0]] = 1;
for(int i=0; i<p; i++){
if(i == 0) printf("%d",order[i]);
else printf(" %d",order[i]);
}
return 0;
}
想着先把名次排出来然后在边比较边复制,没实现出来↓
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int p, g;
vector<int> weight;
vector<int> num;
vector<int> order;
vector<int> fin;
int main(){
scanf("%d%d",&p,&g);
weight.resize(p);
num.resize(p);
order.resize(p);
fin.resize(p);
for(int i=0; i<p; i++)
scanf("%d",&weight[i]);
for(int i=0; i<p; i++){
int a;
scanf("%d",&a);
num[i] = a;
}
int round = g+1;
int k = 0;
int v = p;
while(round >= g){
if(p%g != 0) {
round = p/g+1;
p = round;
order[k] = round + 1;
k++;
}
else {
round = p/g;
p = round;
order[k] = round + 1;
k++;
}
//cout << k << " " << round << endl;
}
order[k] = 2;
k = k+1;
order[k] = 1;
int u=0, c=0, index, t=0;
while(order[t] != 1){
for(; c<g; u++,c++){
if(weight[num[u]] > max){
max = weight[num[u]];
index = num[u];
}
fin[u] = order[t];
}
t++;
c = 0;
}
//for(int i=0; i<=k; i++) cout << order[i] << endl;
return 0;
}