题目链接:http://codeup.cn/problem.php?cid=100000582&pid=1
题目描述
先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。
输入
输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数,第二行的n个数分别对应上一行每个数的分组,n不超过100。
输出
输出m行,格式参见样例,按从小到大排。
样例输入
1
7
3 2 3 8 8 2 3
1 2 3 2 1 3 1
样例输出
1={2=0,3=2,8=1}
2={2=1,3=0,8=1}
3={2=1,3=1,8=0}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
//1113bites
int main(){
int m=0;
while(~scanf("%d",&m)){
while(m--){
int num1[110],num2[110],y1=0,y2=0,n=0,sl[110],nl[110],max=0;
//用hash1给num1去重
int hashTable1[100010]={0};
//用hash2给num2去重
int hashTable2[100010]={0};
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num1[i]);
if(hashTable1[num1[i]]==0){
sl[y1++]=num1[i];
hashTable1[num1[i]]++;
}
}
sort(sl,sl+y1);
for(int i=0;i<n;i++){
scanf("%d",&num2[i]);
if(hashTable2[num2[i]]==0){
nl[y2++]=num2[i];
hashTable2[num2[i]]++;
}
}
sort(nl,nl+y2);
int sout[nl[y2-1]+10][sl[y1-1]+10];
memset(sout,0,sizeof(sout));
//变量不能作为数组的维数
for(int i=0;i<n;i++){
sout[num2[i]][num1[i]]++;
}
for(int i=0;i<y2;i++){
printf("%d={",nl[i]);
for(int j=0;j<y1;j++){
printf("%d=%d",sl[j],sout[nl[i]][sl[j]]);
if(j<y1-1){
printf(",");
}
else{
printf("}\n");
}
}
}
}
}
return 0;
}
易错划重点:
1、变量不能作为数组的维数,如果一定要作为维数要对每一个使用的值重新赋初值再加需要的数,或者用memset函数统一赋值。
2、不使用的变量不要定义。
3、有大量数据和循环的时候一定要注意对应关系。
4、哈希表叫做hashTable而不是hash.
5、数组和二维数组初始化,codeup确实容易报错。主要是不要用={0}来初始化,数组在使用的时候对单个赋值,二维数组在使用的时候用memset赋值就会安全很多。
6、while (~scanf("%d%d",&n,&m))
等效于while((scanf("%d%d",&n,&m)!=EOF)
~是按位取反
scanf的返回值是输入值的个数
如果没有输入值就是返回-1
-1按位取反结果是0
while(~scanf("%d", &n))就是当没有输入的时候退出循环
7、在for循环里定义局部数组变量,用cin可以赋值,用scanf无法赋值。
8、输入不止一组。
9、sout二维数组要开出更大的空间
10、
int sout[nl[y2-1]+10][sl[y1-1]+10];
memset(sout,0,sizeof(sout));
不能直接写为:
int sout[nl[y2-1]+10][sl[y1-1]+10]=0;