2021年PAT乙级秋考 B-5 取帽子 (25 分) 题型:大模拟 独立完成

111 阅读3分钟

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;
}

image.png