問題 B: 分組統計
時間限制: 1 Sec 內存限制: 32 MB
提交: 2134 解決: 522
[提交][狀態][討論版][命題人:外部導入]
題目描述
先輸入一組數,然後輸入其分組,按照分組統計出現次數並輸出,參見樣例。
輸入
輸入第一行表示樣例數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}
分析:題目描述不是很正確。使用哈希的思想,直接使用map映射。有兩個需要注意的地方,一是hash數組的大小設置,因爲題目中整數沒有給範圍,所以要設置大一些;再一個就是我自己的問題,map用過一次後記得清除。
map<int,int[100010]> mp; //這裏的數組相對於hash數組,所以下標對應的是整數的大小
int main(){
int m;
cin>>m;
while(m--){
int n;
cin>>n;
int s1[110];
for(int i=0;i<n;i++)
cin>>s1[i];
int s[110];
for(int i=0;i<n;i++){
cin>>s[i];
mp[s[i]][s1[i]]++;
}
sort(s,s+n);
int l1=unique(s,s+n)-s; //得到分組去重從小到大排序
sort(s1,s1+n);
int l2=unique(s1,s1+n)-s1;//得到輸入數的去重排序
for(int i=0;i<l1;i++){
cout<<s[i]<<"={";
for(int j=0;j<l2;j++){
cout<<s1[j]<<"="<<mp[s[i]][s1[j]];
if(j!=l2-1)
cout<<",";
}
cout<<"}"<<endl;
}
mp.clear(); //注意清除
}
return 0;
}