首页 > 试题广场 >

分组统计

[编程题]分组统计
  • 热度指数:5607 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
先输入一组数,然后输入其分组,按照分组统计出现次数并输出参见样例。

输入描述:
输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数,第二行的n个数分别对应上一行每个数的分组,n不超过100。


输出描述:
输出m行,格式参见样例,按从小到大排。
示例1

输入

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>
#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
  
using namespace std;
map<int,int> mp[105];
int xl[105];
int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        int m;
        cin >> m;
        set<int> st;
        for(int i = 0 ;i<m;i++)
        {
            cin >> xl[i];
            st.insert(xl[i]);
        }
        set<int> group;
        for(int i = 0 ;i<m;i++)
        {
            int x;
            cin >> x;
            mp[x][xl[i]]++;
            group.insert(x);
        }
        for(set<int>::iterator it = group.begin();it!=group.end();it++)
        {
            int x = *it;
            cout << x << "={";
                
            for(set<int>::iterator itt = st.begin();itt!=st.end();itt++)
            {
                int y = *itt;
                cout << y << "=" << mp[x][y] ;
                itt++;
                if(itt != st.end())
                cout << ",";
                itt--;
            }
            cout << "}" << endl;
            mp[x].clear();
        }
        
    }
}

发表于 2019-03-04 21:30:27 回复(5)
两个TreeMap嵌套,会自动升序排序,毕竟是红黑树。
import java.util.*;
import java.util.Map.Entry;

public class Main {

    public static void main(String[] args) throws Exception {
        
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        for (int i = 1; i <= m; i++) {
            // 红黑树结构的集合,可以去重, 而且可以升序排序
            TreeSet<Integer> ts1 = new TreeSet<>();
            TreeSet<Integer> ts2 = new TreeSet<>();
            int n = sc.nextInt();
            int[] a1 = new int[200];
            int[] a2 = new int[200];
            for (int j = 0; j < n; j++) {
                a1[j] = sc.nextInt();
                ts1.add(a1[j]);
            }
            for (int j = 0; j < n; j++) {
                a2[j] = sc.nextInt();
                ts2.add(a2[j]);
            }
            // 两层map,形成{1:{3:0, 8:0}, 2:{3:0, 8:0}}的结构
            // 后面再遍历一遍, 将其中的0修改为实际出现的次数
            // 以第二行的元素为key, value是第一行的所有元素,出现次数0
            TreeMap<Integer, TreeMap<Integer, Integer>> tm1 = new TreeMap<>();
            for (Integer e : ts2) {
                TreeMap<Integer, Integer> tm2 = new TreeMap<>();
                for (Integer ea : ts1) {
                    tm2.put(ea, 0); // 初始次数为0
                }
                tm1.put(e, tm2);
            }
            // 遍历n个元素, 修改其中第一行元素出现的次数
            for (int j = 0; j < n; j++) {
                TreeMap<Integer, Integer> tm2 = tm1.get(a2[j]);
                int t = tm2.get(a1[j]);
                tm2.put(a1[j], ++t);
                // tm1.put(a2[j], tm2); // 引用类型,不需要重新put一遍
            }
            // 因为treeMap,会自动由小到大排序的
            for (Entry<Integer, TreeMap<Integer, Integer>> e : tm1.entrySet()) {
                System.out.print(e.getKey() + "={");
                boolean f = true;//判断是否要加逗号
                for (Entry<Integer, Integer> ea : e.getValue().entrySet()) {
                    if (f) {
                        System.out.print(ea.getKey() + "=" + ea.getValue());
                        f = false;
                    }else {
                        System.out.print(","+ea.getKey() + "=" + ea.getValue());
                    }
                }
                System.out.println("}");
            }

        }

    }
}



编辑于 2020-08-26 00:09:27 回复(1)
//1.根据分组把相同组的数拿出来2.对一个组的数进行排序,去重的同时计算每个数的个数
#include<stdio.h>
int main()
{
    int m;
    scanf("%d",&m);
    while(m--)
    {
        int n,a[1000]={0},aa[1000]={0},bb[1000]={0},b[1000]={0},c[1000]={0},p,max=0,i,j,k,num;
        scanf("%d",&n);//输入
        for(i=0;i<n;i++)
            {scanf("%d",&a[i]);
            aa[i]=a[i];}
        for(i=0;i<n;i++)
        {
            scanf("%d",&b[i]);
            bb[i]=b[i];
            if(b[i]>max)
                max=b[i];//最大组
        }
        //对原数据排序去重
        int w=n;
        for(i=0;i<w-1;i++)
            for(j=0;j<w-1-i;j++)
            if(aa[j]>aa[j+1])
        {
            int t=aa[j];aa[j]=aa[j+1];aa[j+1]=t;
        }
        for(i=0;i<w;i++)
        {
            if(aa[i]==aa[i+1])
            {
                for(j=i;j<w;j++)
                    aa[j]=aa[j+1];
                i--;w--;
            }
        }

        //对原数据排序去重
        int w1=n;
        for(i=0;i<w1-1;i++)
            for(j=0;j<w1-1-i;j++)
            if(bb[j]>bb[j+1])
        {
            int t=bb[j];bb[j]=bb[j+1];bb[j+1]=t;
        }
        for(i=0;i<w1;i++)
        {
            if(bb[i]==bb[i+1])
            {
                for(j=i;j<w1;j++)
                    bb[j]=bb[j+1];
                i--;w1--;
            }
        }
        //分割每一组
        for(i=0;i<w1;i++)//每一组
        {
            num=0;
            for(j=0;j<n;j++)
            {
                if(bb[i]==b[j])//在同一组
                c[num++]=a[j];
            }
            //对比个数
            int count[100]={0};
            for(j=0;j<w;j++)
            {
                for(k=0;k<num;k++)
                    if(c[k]==aa[j])
                    count[j]++;
            }
            //输出
            printf("%d={",bb[i]);
            for(j=0;j<w-1;j++)
                printf("%d=%d,",aa[j],count[j]);
            printf("%d=%d}\n",aa[w-1],count[w-1]);
        }
    }
}

发表于 2020-05-10 18:31:50 回复(0)
//算法思想:将第一组元素分别存入vector和set中。存入set中是为了去充。第二组数据
//也是同样的操作。然后map中将set2的每一元素对应于set1中所有的元素组合置零操作。
//再将map对应的元素加一操作,然后进行打印。
#include<map>
#include<vector>
#include<iostream>
#include<set>
using namespace std;
int main(int argc, char const *argv[])
{
    int num,n;
    std::vector<int> v1;
    std::vector<int> v2;
    set<int> s1;
    set<int> s2;
    map<int,int> mp[10000];
    while(scanf("%d",&num)!=EOF)
    {
        while(num--)
        {
            scanf("%d",&n);
            int temp,count;
            for (int i = 0; i < n; ++i)
            {
                scanf("%d",&temp);
                v1.push_back(temp);//将第一组数存入vector
                s1.insert(temp);//将第一组数存入set
            }
            for (int i = 0; i < n; ++i)
            {
                scanf("%d",&temp);
                v2.push_back(temp);//将第二组数存入vector
                s2.insert(temp);//将第二组数存入set
            }
            for(set<int>::iterator it2=s2.begin(); it2!=s2.end(); it2++)//初始化
            {
                for(set<int>::iterator it1=s1.begin(); it1!=s1.end(); it1++)
                {
                    mp[*it2][*it1]=0;//初始化map
                }
            }
            for (int i = 0; i < n; ++i)//计算个数
            {
                mp[v2[i]][v1[i]]++;
            }
            for(set<int>::iterator it2=s2.begin(); it2!=s2.end(); it2++)
            {
                cout<<*it2<<"={";
                count=0;
                for(map<int,int>::iterator it=mp[*it2].begin(); it!=mp[*it2].end();it++)
                {
                    count++;
                    cout<<it->first<<"="<<it->second;
                    if(count!=s1.size())
                        printf(",");
                }
                cout<<"}"<<endl;
                mp[*it2].clear();
            }
            v1.clear();
            v2.clear();
            s1.clear();
            s2.clear();
        }
    }
    return 0;
}


发表于 2019-03-19 23:25:57 回复(0)
就我一个觉得第一个数字真的很多余吗。。。。搞了很久发现是这个错误
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>
int flag[1001]; int A[1001]; int B[1001]; int count_AB[1001][1001];  //表示i在j集合里面的数目 int main() {
    int m, n;     while(scanf("%d", &m) != EOF) {         int x;         for(x=m;x>0;x--)         {         scanf("%d", &n);         memset(flag, 0, sizeof(flag));         memset(count_AB, 0, sizeof(count_AB));         int i, j;         for(i = 0; i < n; i++) {             scanf("%d", &A[i]);         }         for(i = 0; i < n; i++) {             scanf("%d", &B[i]);             int a = A[i];             int b = B[i];             flag[b] = 1; //对应的表示这个集合存在             count_AB[a][b]++;         }         //把重复的去掉之后进行冒泡排序         int newA[1001];         int count = 0; //这个是用来记住去掉重复之后的数组大小         int newflag[1001];         memset(newflag, 1, sizeof(newflag));         for(i = 0; i < n; i++) {             if(newflag[i]) {                 newA[count++] = A[i];                 for(j = i + 1; j < n; j++) {                     if(A[i] == A[j] )                         newflag[j] = 0; //出现重复                 }             }         }         //进行冒泡排序         for(i = 0; i < count - 1; i++) {             for(j = 0; j < count - 1 - i; j++) {                 if(newA[j] > newA[j + 1]) {                     int temp = newA[j];                     newA[j] = newA[j + 1];                     newA[j + 1] = temp;                 }             }         }         for(i = 0; i <= n; i++) {             if(flag[i] == 1) { //该集合存在                 //并且i的值就是集合号                 printf("%d={", i);                 for(j = 0; j < count; j++) {                     if(j != count - 1) {                         printf("%d=%d,", newA[j], count_AB[newA[j]][i]);                     } else {                         printf("%d=%d}", newA[j], count_AB[newA[j]][i]);                     }                 }                 printf("\n");             }         }         }     }     return 0; }

发表于 2019-03-08 23:45:59 回复(0)
#include <iostream>
#include <map>
using namespace std;

int main(){
//输入数据
    int m;
    cin>>m;
    for(int i=0;i<m;i++){
        int n;
        cin>>n;
        int arr1[n];
        int arr2[n];
        for(int j=0;j<n;j++){
            cin>>arr1[j];
        }
        for(int j=0;j<n;j++){
            cin>>arr2[j];
        }
//利用嵌套map进行计数,注意输出0和不要重复输出
        map<int,map<int,int> > mp;
        int arr[100] = {0};
        for(int k=0;k<n;k++){
            if(arr[arr2[k]] == 0){
                for(int t=0;t<n;t++){
                    if(arr2[t] == arr2[k])
                        mp[arr2[k]][arr1[t]]++;
                    else if(mp[arr2[k]][arr1[t]]==0)
                        mp[arr2[k]][arr1[t]]=0;
                }
                arr[arr2[k]] = 1;
            }
        }
        for(auto p=mp.begin();p!=mp.end();p++){
            cout<<p->first<<"={";
            int tmp = 0;
            for(auto pp=(p->second).begin();pp!=(p->second).end();pp++){
                if(tmp<p->second.size()-1)
                    cout<<pp->first<<"="<<pp->second<<",";
                else 
                    cout<<pp->first<<"="<<pp->second;
                tmp++;
            }
            cout<<"}"<<endl;
        }
    }
    return 0;
}

发表于 2019-04-19 00:08:37 回复(0)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			int m = scanner.nextInt();
			for(int i = 0;i < m; i++) {
				
				int n = scanner.nextInt();
				
				//保存数的数组
				int[] arr = new int[n];
				//保存组的数组
				int[] group = new int[n];
			
				//用来统计不同数的情况,排除重复
				List<Integer> arrList = new ArrayList<Integer>();
				//用来统计不同组的情况,排除重复
				List<Integer> groupList = new ArrayList<Integer>();
				
				for (int j = 0; j < n; j++) {
					arr[j] = scanner.nextInt();
					if (!arrList.contains(arr[j])) {
						arrList.add(arr[j]);
					}
				}

				//数按顺序排列
				Collections.sort(arrList);
				
				for (int j = 0; j < n; j++) {
					group[j] = scanner.nextInt();
					if (!groupList.contains(group[j])) {
						groupList.add(group[j]);
					}
				}
				
				//组按顺序排列
				Collections.sort(groupList);
				
				for (int j = 0; j < groupList.size(); j++) {
					
					System.out.print(groupList.get(j)+"={");
					
					for (int k = 0; k < arrList.size(); k++) {
						
						System.out.print(arrList.get(k)+"=");
						
						//用来统计该组中,某数出现的次数
						int sum = 0;
						
						for (int k2 = 0; k2 < n; k2++) {
							
							if (arr[k2] == arrList.get(k) && group[k2] == groupList.get(j)) {
								sum++;
							}
						}
						if(k == arrList.size()-1) {
							//如果是最后一个则后面加"}"
							System.out.println(sum+"}");
						}else {
							//如果不是末尾则后面加","
							System.out.print(sum+",");
						}
					}
					
				}
				
			}
		}
	}
}


编辑于 2024-03-22 15:32:11 回复(0)
//经测试,本题实际分组不是顺序递增,而是有间断不连续的
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
struct Number{
    int data;
    int group;
};
int main(){
    int m;
    cin >> m;
    while(m--){
        int n;
        cin >> n;
        Number arr[n];
        for(int i=0; i<n; ++i){
            cin >> arr[i].data;
        }
        int M = -1e9;
        for(int i=0; i<n; ++i){
            cin >> arr[i].group;
            M = max(M, arr[i].group);    //最大组数
        }
        vector<bool> exist(M+1, false);    //只是为了赋初值
        for(int i=0; i<n; ++i){
            exist[arr[i].group] = true;    //标记目标分组
        }
        map<int, int> mymap[M+1];
        for(int j=1; j<=M; ++j){
            if(exist[j]){        //仅针对目标分组
                for(int i=0; i<n; ++i) {
                    mymap[j][arr[i].data] = 0;    //为所有数建立映射,次数初始都为0;
                }
            }
        }
        for(int i=0; i<n; ++i){    //统计数量
            mymap[arr[i].group][arr[i].data]++;
        }
        for(int i=1; i<=M; ++i){
            if(exist[i]){    //输出结果,仅针对实际存在的组
                cout << i << "={";
                for(auto it=mymap[i].begin(); it!=mymap[i].end();){
                    cout << it->first << "=" << it->second;
                    if(++it!=mymap[i].end()) cout << ",";
                }
                cout << "}" << endl;
            }
        }
    }
}

发表于 2024-03-16 22:07:57 回复(0)
arn头像 arn
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        for (int i = 0; i < m; i++) {
            int n = sc.nextInt();
            int a[] = new int[n];
            int c[] = new int[n];
            Map<Integer, String> map = new HashMap<>();
            Set<Integer> set = new HashSet<>();
            for (int j = 0; j < n; j++) {
                a[j] = sc.nextInt();
                set.add(a[j]);
            }
            for (int j = 0; j < n; j++) {
                c[j] = sc.nextInt();
            }
            for (int j = 0; j < n; j++) {
                if (!map.containsKey(c[j])) {
                    map.put(c[j], "" + a[j]);
                } else {
                    map.replace(c[j], map.get(c[j]) + " " + a[j]);
                }
            }
            Object []obj = set.toArray();
            Arrays.sort(obj);
            for (Integer x : map.keySet()) {
                System.out.print(x + "={");
                print(x, map, obj);
                System.out.println("}");
            }
        }
    }

    private static void print(Integer x, Map<Integer, String> map, Object[] obj) {
        // TODO 自动生成的方法存根
        String s = map.get(x);
        String ss[] = s.split(" ");
        for (int i = 0; i < obj.length; i++) {
            int count = 0;
            for (int j = 0; j < ss.length; j++) {
                if (Integer.parseInt(ss[j]) == (Integer)obj[i]) {
                    count++;
                }
            }
            if (i != obj.length - 1)
                System.out.print(obj[i] + "=" + count + ",");
            else
                System.out.print(obj[i] + "=" + count);
        }
    }
}

发表于 2023-03-20 16:33:34 回复(0)
用二维数组存储的,行是位置,列是数字,二维数组值是该数该位置出现次数,此外分别用sset1和sset2统计出现的数字(去重并排序)、行(去重并排序),输出的时候利用。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;

int hasnt(int sset[],int pos,int num){
    for(int i=0;i<pos;i++){
        if(sset[i]==num){
            return 0;
        }
    }
    return 1;
}

int main(){
    int m;
    while(cin>>m){
        for(int time=0;time<m;time++){
            int n;
            cin>>n;
            int hash[100][1001];
            memset(hash,-1,sizeof(hash));  //二维数组初始化
            int a[n],b[n],sset1[1001],sset2[100];
            int pos1=0;
            memset(sset1,1001,sizeof(sset1));
            for(int i=0;i<n;i++){
                cin>>a[i];
                if(hasnt(sset1,pos1,a[i])){
                    sset1[pos1++]=a[i];
                }         
            }
            sort(sset1,sset1+pos1);
            int pos2 = 0;
            memset(sset2,101,sizeof(sset2));
            for(int i=0;i<n;i++){
                cin>>b[i]; 
                if(hasnt(sset2,pos2,b[i])){
                    sset2[pos2++]=b[i];
                }   
                if(hash[b[i]][a[i]]==-1){
                    hash[b[i]][a[i]]=1;
                }else{
                    hash[b[i]][a[i]]++;
                }
            }
            sort(sset2,sset2+pos2);
            for(int i=0;i<pos2;i++){
                cout<<sset2[i]<<"={";
                for(int j=0;j<pos1;j++){
                    int cnt = hash[sset2[i]][sset1[j]];
                    if(cnt==-1) cnt=0;
                    if(j==pos1-1) cout<<sset1[j]<<"="<<cnt<<"}"<<endl;
                    else cout<<sset1[j]<<"="<<cnt<<",";
                }
            }
        }
    }
}

发表于 2022-07-19 11:23:36 回复(0)
使用STL
#include<iostream>
#include<map>
#include<vector>
#include<set>
using namespace std;
int main(){
    int m, n;
    cin >> m;
    while(m--){
        cin >> n;
        map<int, map<int,int>> result;
        vector<int> nums(n), groups(n);
        set<int> num_set;
        for(int i = 0;i < n;i++){
            cin >> nums[i];
            num_set.insert(nums[i]);
        }
        for(int i = 0;i < n;i++)
            cin >> groups[i];
        map<int,int> temp_map;
        for(auto iter = num_set.begin();iter != num_set.end();iter++){
            temp_map.insert(pair<int, int>(*iter,0));
        }
        
        for(int i = 0;i < n;i++){
            auto iter = result.find(groups[i]);
            if(iter == result.end()){
                result.insert(pair<int, map<int,int>>(groups[i], temp_map));
                result[groups[i]][nums[i]]++;
            }else{
                    iter->second[nums[i]]++;
            }
        }
        for(auto iter = result.begin();iter != result.end();iter++){
            cout << iter->first << "={";
            for(auto sub_iter = iter->second.begin();sub_iter != iter->second.end();sub_iter++){
                if(sub_iter != iter->second.begin()) cout << ",";
                cout << sub_iter->first << "=" << sub_iter->second; 
            }
            cout << "}";
            cout << endl;
        }
    }
}


发表于 2022-05-13 12:51:18 回复(0)
WA,请求指点

#include<stdio.h>
#include<cstring>
#include<map>

using namespace std;

const int MAXN=100+10;

int arr1[MAXN];
int arr2[MAXN];

map<int,int> myMap[MAXN];

int main(){
    int m;
    scanf("%d",&m);
    while(m--){
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++){          //输入
            scanf("%d",&arr1[i]);
        }
         for(int i=0;i<n;i++){         //输入
            scanf("%d",&arr2[i]);
        }
        int size=0;
        for(int i=0;i<n;i++){
            myMap[arr2[i]][arr1[i]]++;     //按题目要求进行统计
            size=max(size,arr2[i]);      //统计共有多少个类别
        }
        for(int i=1;i<=size;i++){
            for(int j=0;j<n;j++){
                myMap[i][arr1[j]];          //对于该类别未出现的数字,计数置0
            }
        }
        for(int i=1;i<=size;i++){          //输出
            printf("%d={",i);
            for(auto it=myMap[i].begin();it!=myMap[i].end();it++){
                if(it==myMap[i].begin()) printf("%d=%d",it->first,it->second);
                else printf(",%d=%d",it->first,it->second);
            }
            printf("}\n");
        }
        for(int i=1;i<=size;i++){      //将已用map清空,以便下一轮的使用
            myMap[i].clear();
        }


    }
    return 0;
}

发表于 2022-03-18 18:14:27 回复(0)
#include <bits/stdc++.h>
using namespace std;
#define N 1e5+5

vector<int> v;
map<int,map<int,int> >mp;
int main(){
	int m,n,t;
	cin>>m;
	while(m--){
		v.clear();mp.clear();
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>t;
			v.push_back(t);
		}
		for(int i=0;i<n;i++){
			cin>>t;
			mp[t][v[i]]++;
		}
		for(auto p=mp.begin();p!=mp.end();p++){
			for(auto q=v.begin();q!=v.end();q++)
				if((p->second).find(*q)==(p->second).end())(p->second)[*q]=0;
		}
		for(auto p=mp.begin();p!=mp.end();p++){
			cout<<p->first<<"={";
			for(auto q=(p->second).begin();q!=(p->second).end();q++){
				if(q!=(p->second).begin())cout<<",";
				cout<<q->first<<"="<<q->second;
			}	
			cout<<"}"<<endl;
		}
	}
	return 0;
}

发表于 2021-03-03 18:11:04 回复(0)
#include<iostream>
#include<queue>
#include<map>
using namespace std;

int main()
{
    int m,n,f;
    while(cin >> m)
    {
        while(m--)
        {
            map<int,int> p;
            map<int,map<int,int>> p1;
            cin >> n;
            int t[n];
            for(int i = 0;i < n;i++)
            {
                cin >> t[i];
                if(!p.count(t[i])) p[t[i]] = 0;
            }
            for(int i = 0;i < n;i++)
            {
                cin >> f;
                if(p1.count(f))
                {
                    p1[f][t[i]]++;
                }
                else
                {
                    p1[f] = p;
                    p1[f][t[i]]++;
                }
            }
            for(auto q : p1)
            {
                cout << q.first << "={";
                int i = 0;
                for(auto r : q.second)
                {
                    if(i == 0) cout << r.first << "=" << r.second;
                    else cout << "," << r.first << "=" << r.second;
                    i++;
                }
                cout << "}" << endl;
            }
        }
    }
    return 0;
}

发表于 2021-02-25 20:55:59 回复(0)
#include<iostream>
#include<numeric>
#include<string>
#include<vector>
#include<math.h>
#include<map>
#include<set>
#include<algorithm>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
using namespace std;


int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        for (int i = 0; i < n; i++) {
            int len;
            cin >> len;
            vector<int> data;
            for (int j = 0; j < len; j++) {    
                int num;
                cin >> num;
                data.push_back(num);
            }
            vector<int> ind;
            for (int j = 0; j < len; j++) {    
                int index;
                cin >> index;
                ind.push_back(index);
            }


            map<int, vector<int>> mp;
            for (int i = 0; i < len; i++) {
                mp[ind[i]].push_back(data[i]);
            }

            set<int> st(data.begin(),data.end());
            set<int>::iterator sit;
            set<int>::reverse_iterator rsit = st.rbegin();
            map<int, vector<int>>::iterator mit;
            for (mit = mp.begin(); mit != mp.end(); mit++) {
                cout << (*mit).first << "={";

                for (sit = st.begin(); sit != st.end(); sit++) {
                    cout <<(*sit)<<"=" << count((*mit).second.begin(),(*mit).second.end(),(*sit));
                    if((*sit) != (*rsit)){
                         cout << ",";
                    }
                }
                cout << "}" << endl;
            }

        }
    }
    return 0;
}
编辑于 2021-02-04 14:06:02 回复(0)
想问下测试用例是什么?
发表于 2021-02-02 22:52:12 回复(0)
这题有个大坑,组数可能不连续的
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int num[1010];

int main()
{
    int n_case, n, a, g, gnum;
    cin >> n_case;
    while (n_case--) {
        cin >> n;
        gnum = 0;
        vector<int> no;
        vector<int> gs[1010];
        map<int, int> m;
        map<int, int> ms[1010];
        for (int i = 0; i < n; i++) {
            cin >> num[i];
            if (m.count(num[i]) == 0) {
                no.push_back(num[i]);
            }
            m[num[i]]++;
        }
        for (int i = 0; i < n; i++) {
            cin >> g;
            gnum = max(gnum, g);
            gs[g].push_back(num[i]);
            ms[g][num[i]]++;
        }
        sort(no.begin(), no.end());
        for (int i = 1; i <= gnum; i++) {
            if (gs[i].size()) {
                cout << i << "={";
                for (int j = 0; j < no.size(); j++) {
                    cout << no[j] << "=" << ms[i][no[j]];
                    if (j != no.size()-1)
                        cout << ",";
                }
                cout << "}" << endl;
            }
        }
    }
    return 0;
}


发表于 2021-02-02 00:16:17 回复(0)
#include<bits/stdc++.h>

using namespace std;

int main(){
    int m,n;
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>n;
        set<int> st1,st2;
        map<int,int> maps[101];
        int nums[101];
        for(int i=0;i<n;i++){
            cin>>nums[i];
            st1.insert(nums[i]);
        }
        for(int i=0;i<n;i++){
            int group;
            cin>>group;
            st2.insert(group);
            if(maps[group].find(nums[i])==maps[group].end()) maps[group][nums[i]]=1;
            else maps[group][nums[i]]++;
        }

        for(set<int>::iterator it2=st2.begin();
            it2!=st2.end();it2++){
            cout<<*it2<<"={";
            int stsize=st1.size();
            int cnt=0;
            for(set<int>::iterator it1=st1.begin();
            it1!=st1.end();it1++){
                cnt++;
                cout<<*it1<<"="<<(maps[*it2][*it1]!=NULL?maps[*it2][*it1]:0);
                if(cnt<stsize)
                cout<<",";
            }
            cout<<"}"<<endl;

            }
    }

    return 0;
}

发表于 2020-08-17 00:37:02 回复(0)
#include <iostream>
using namespace std;

void Input(int *arr, int n)
{
    for(int i=0;i<n;i++)
        cin>>arr[i];
}
int main()
{
    int m;
    cin>>m;
    while(m--)
    {
        int n;
        cin>>n;
        int *nums = new int[n];
        int *group = new int[n];
        Input(nums, n);
        Input(group, n);
        int maxgroup=0;
        for(int i=0;i<n;i++)
            if(group[i]>maxgroup)
                maxgroup=group[i];
        int maxnum = nums[0];
        for(int i=0;i<n;i++)
            if(nums[i]>maxnum)
                maxnum=nums[i];
        int hashnum[maxgroup][maxnum+1];
        for(int i=0;i<maxgroup;i++)
            for(int j=0;j<maxnum+1;j++)
                hashnum[i][j]=0;
        bool *hasNum = new bool[maxnum+1];
        bool *hashGroup = new bool[maxgroup];
        for(int i=0;i<n;i++)
        {
            hashnum[group[i]-1][nums[i]]++;
            hasNum[nums[i]]=true;
            hashGroup[group[i]-1]=true;
        }
        int lastnum = 0;
        for(int i=0;i<maxnum+1;i++)
            if(hasNum[i]) lastnum=i;
        for(int i=0;i<maxgroup;i++)
        {
            if(!hashGroup[i])
                continue;
            cout<<i+1<<"={";
            for(int j=0;j<maxnum+1;j++)
            {
                if(hasNum[j])
                {
                    if(j<lastnum)
                        cout<<j<<"="<<hashnum[i][j]<<",";
                    else
                        cout<<j<<"="<<hashnum[i][j]<<"}";
                }
            }
            cout<<endl;
        }
    }
    return 0;
}

发表于 2020-06-13 22:21:30 回复(0)