这题目前对我来说巨难,for range循环我还用不了这么熟练,借助DeepSeek实现了以下代码
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
int main() {
int m, n;
scanf("%d", &m); // 读取测试用例数量
while (m--) {
scanf("%d", &n); // 读取每组数据的数量
int arr[100], group[100];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]); // 读取数值
}
for (int i = 0; i < n; i++) {
scanf("%d", &group[i]); // 读取分组
}
// 使用 map 存储每个分组的所有数
map<int, vector<int>> groupMap;
for (int i = 0; i < n; i++) {
groupMap[group[i]].push_back(arr[i]);
}
// 遍历每个分组
for (auto &[groupNum, nums] : groupMap) {
// 统计每个数的出现次数
map<int, int> countMap;
for (int num : nums) {
countMap[num]++;
}
// 输出分组信息
printf("%d={", groupNum);
bool first = true;
for (auto &[num, count] : countMap) {
if (!first) {
printf(",");
}
printf("%d=%d", num, count);
first = false;
}
printf("}\n");
}
}
return 0;
}
但是还差一个逻辑,就是所有的数,本组内没出过的数也要统计一个0,这部分是自己实现的
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <map>
#include <vector>
#include <set>
using namespace std;
int main() {
int m, n;
scanf("%d", &m); // 读取测试用例数量
while (m--) {
scanf("%d", &n); // 读取每组数据的数量
set<int> occur;
int arr[100], group[100];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]); // 读取数值
occur.insert(arr[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &group[i]); // 读取分组
}
// 使用 map 存储每个分组的所有数
map<int, vector<int>> groupMap;
for (int i = 0; i < n; i++) {
groupMap[group[i]].push_back(arr[i]);
}
// 遍历每个分组内的所有数,并统计出现次数
for (auto& [groupNum, nums] : groupMap) {
// 统计每个数的出现次数
map<int, int> countMap;
for (int num : nums) {
countMap[num]++;
}
// 没出现过的数置为0
for (auto it = occur.begin(); it != occur.end(); it++) {
if (countMap.find(*it) == countMap.end()) {
countMap[*it] = 0;
}
}
// 输出分组信息
printf("%d={", groupNum);
bool first = true;
for (auto& [num, count] : countMap) {
if (!first) {
printf(",");
}
printf("%d=%d", num, count);
first = false;
}
printf("}\n");
}
}
return 0;
}

京公网安备 11010502036488号