2021年PAT乙级 B-2 数以类聚 (20 分) 题型:模拟 独立完成

67 阅读1分钟

7-2 数以类聚 (20 分)

我们把所有各位数字的乘积相同的数归为一类。例如 1362 和 2332 就是同一类,因为 1×3×6×2=2×3×3×2。给定 N 个正整数,请你判断它们可以被归成多少不同的类? 输入格式 输入在第一行给出一个正整数 N(≤105),第二行给出 N 个不超过 107
的正整数,数字间以空格分隔。
输出格式
在一行中输出 N 个给定的整数可以归类的数量、以及规模最大的类中最小的乘积。数字间以一个空格分隔。 输入样例

10
1234 98 329 9552 47621 8862 5539 2333 5365 463

输出样例

7 54

思想

题目的第一个空就是用哈希去完重的个数,第二个求的是second中最大的当中的first最小的那个 image.png

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
set<LL>s;
map<LL, int>haxi;

LL Sum(int x) {
	int sum = 1;
	while (x) {
		sum *= (x % 10);
		x /= 10;
	}
	return sum;
}

bool cmp(pair<LL, int>a, pair<LL, int>b) {
	if (a.second == b.second)
		return a.first < b.first;
	return a.second > b.second;
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		LL sum = Sum(x);
		cout << sum << " ";
		haxi[sum]++;
	}
	cout << endl;

	vector<pair<LL, int>>v(haxi.begin(), haxi.end());
	sort(v.begin(), v.end(), cmp);

	LL maxn = 0x3f3f3f3f3f3f3f3f;


	cout << haxi.size() << " " << v[0].first << endl;
	//cout << s.size() << " " << maxn << endl;
	return 0;
}