问题 B: 分组统计
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 32 MB
题目描述
先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。
输入
输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数,第二行的n个数分别对应上一行每个数的分组,n不超过100。
输出
输出m行,格式参见样例,按从小到大排。
样例输入 Copy
1
7
3 2 3 8 8 2 3
1 2 3 2 1 3 1
样例输出 Copy
1={2=0,3=2,8=1}
2={2=1,3=0,8=1}
3={2=1,3=1,8=0}
此题关键在于用二维数组,哈希存储思想,解决一个映射问题,然后再对两个数组排序,去重,之后返回去重的个数,然后直接输出即可。
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int ans[1000][1000];
int del(int a[],int n){
int temp = a[0];
int j = 0;
for(int i=1;i < n;i++){
if(a[i]!=temp){
a[++j] = a[i]; //a[0]肯定先存 所以++j
temp = a[i];//不等需要记录temp
}
}
return j+1;//记录个数
}
int main() {
int N;
// freopen("d://in.txt","r",stdin);
while(scanf("%d",&N)!=EOF) {
while(N--) {
int M;
scanf("%d",&M);
int a[210] = {0};//题目
int b[210] = {0};//分组
memset(ans,0,sizeof(ans));
for(int i =0; i < M; i++) {
scanf("%d",&a[i]);
}
for(int i = 0; i < M; i++) {
scanf("%d",&b[i]);
ans[b[i]][a[i]]++;
}
//输出的时候需要题目不重,分组也不重。排序
sort(a,a+M);
sort(b,b+M);
int an = del(a,M);
int bn = del(b,M);
for(int i = 0;i < bn;i++){
printf("%d={",b[i]);
for(int j = 0; j < an;j++){
printf("%d=%d",a[j],ans[b[i]][a[j]]);
if(j == an-1) printf("}");
else printf(",");
}
printf("\n");
}
}
}
return 0;
}