问题 B: 分组统计
时间限制: 1 Sec 内存限制: 32 MB
提交: 1754 解决: 440
题目描述
先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。
输入
输入第一行表示样例数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 <vector>
#include <map>
#include <set>
using namespace std;
int main(){
int m; //m个例子
scanf("%d",&m);
while(m--){
int n; //n个数
set <int> st1;//记录第一行不重复数
set <int> st2;//记录组别
vector <int> vi1;//记录第一行
vector <int> vi2;//记录第二行
scanf("%d",&n);
for(int i=0;i<n;i++){
int tmp;
scanf("%d",&tmp);
vi1.push_back(tmp);
st1.insert(tmp);
}
for(int i=0;i<n;++i){
int gp;
scanf("%d",&gp);
vi2.push_back(gp);
st2.insert(gp);
}
for(set<int>::iterator it=st2.begin();it!=st2.end();++it){
printf("%d={",*it);
map<int,int> mp;
for(set<int>::iterator i=st1.begin();i!=st1.end();++i){
mp[*i]=0;
}
for(int i=0;i<n;++i){
if(vi2[i]==*it){
mp[vi1[i]]++;
}
}
for(set<int>::iterator i=st1.begin();i!=st1.end();++i){
if(i!=st1.begin()) printf(",");
printf("%d=%d",*i,mp[*i]);
}
printf("}\n");
}
}
return 0;
}
总结:我爱coding,coing使我秃头,使我欢乐:-) 这题是真的恶心,Codeup题目很喜欢循环输入啊....做题速度那么慢,考试会死吧......这题稍微有点bug,一难理解,然后第一个参数m其实是m个案例,第二行组别数目是需要你自己数的,造成后面时间消耗很大