B-5 取帽子 (25 分)
拼题er们觉得戴帽子会令自己看上去很帅,所以他们不管到哪里都会戴着帽子。有一天他们去到一家餐厅,服务员把他们的帽子收集了堆起来保管。当大家要离开的时候,发现帽子被像上图那样摞起来了。于是你的任务就是帮他们排好队,使得每个人都能按顺序顺利取到自己的帽子。 已知每顶帽子的大小都不相同,并且帽子的尺寸跟帽子主人的体重有关 —— 越重的人戴的帽子就越大。 输入格式 输入第一行给出一个正整数 N (≤104),为拼题er的人数。随后一行给出 N 个不同的帽子尺寸,为不超过 105的正整数,顺序是从帽子堆的底部向上给出。最后一行给出 N 个不同的体重,顺序对应编号从 1 到 N 的拼题er。体重是不超过 106的正整数。一行中的数字以空格分隔。
输出格式
在一行中按照取帽子的顺序输出帽子主人的编号。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例
10
12 19 13 11 15 18 17 14 16 20
67 90 180 98 87 105 76 88 150 124
输出样例
3 4 8 6 10 2 1 5 9 7
思想
这是一个模拟题,我用一个结构体(也可以用map)存储val值和其排完序之后的下标记sortidx。
在后续从尾向头遍历的时候,如果hap[i]和width[j]的sortidx相同,那么就输出j(当前体重的没排序前的下标)。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e4 + 10;
int n;
struct Point {
int val;
int sortidx;
};
//first用来存当前值,second值原来存排完序之后的位置
//首先倒着遍历,当遍历到当前元素时,看一下second位置在哪,去输出对应second位置的idx下标
bool cmp(struct Point a, struct Point b) {
return a.val < b.val;
}
signed main() {
cin >> n;
vector<Point> hap(n);
vector<Point>width(n);
for (int i = 0; i < n; i++)
cin >> hap[i].val;
for (int i = 0; i < n; i++)
cin >> width[i].val;
vector<Point>t1, t2;
t1 = hap;
t2 = width;
sort(t1.begin(), t1.end(), cmp);
sort(t2.begin(), t2.end(), cmp);
// cout << "t1: ";
// for (int i = 0; i < n; i++) {
// cout << t1[i].val << " ";
// }
// cout << endl;
//
// cout << "t2: ";
// for (int i = 0; i < n; i++) {
// cout << t2[i].val << " ";
// }
// cout << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (hap[i].val == t1[j].val) {
hap[i].sortidx = j;
}
if (width[i].val == t2[j].val) {
width[i].sortidx = j;
}
}
}
// for (int i = n - 1; i >= 0; i--) {
// cout << "hap[i].val: " << hap[i].val << " " << "hap[i].sortidx: " << hap[i].sortidx << " " << "i:" << i << endl;
// }
// cout << endl;
// for (int j = n - 1; j >= 0; j--) {
// cout << "width[j].val: " << width[j].val << " " << "width[j].sortidx: " << width[j].sortidx << " " << "j: " << j <<
// endl;
// }
// cout << endl;
for (int i = n - 1; i >= 0; i--) {
for (int j = n - 1; j >= 0; j--) {
if (hap[i].sortidx == width[j].sortidx) {
//cout << "hap[i].val: " << hap[i].val << " " << "hap[i].sortidx: " << hap[i].sortidx << " " << "i:" << i << endl;
//cout << "width[j].val: " << width[j].val << " " << "width[j].sortidx: " << width[j].sortidx << " " << "j: " << j << endl;
cout << j + 1 << " ";
}
}
}
return 0;
}