分组统计(表,查找,边插入边排序)

分组统计(表,查找,边插入边排序)


问题描述

​ 先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。

输入格式

​ 输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数,第二行的n个数分别对应上一行每个数的分组,n不超过100。数和分组号的值都不超过10000。

输出格式

​ 按顺序输出各个样例的结果。输出格式参见样例,按组号从小到大输出,组内数字也按编号从小到大输出。

样例输入

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}

样例说明

​ 第一行输入1,就说明只有一组数据,下面的没三行代表一组数据,每组数据中
​ 第一行代表数字的个数,如7 有七个数字
​ 第二行 输入的就是数字了 2 3 3 8 8 2 3
​ 第三行 表示第二行的分组 如 1 上面为 3 表明3 在1的集合中

思路

​ 第一次做这道题的时候我就想这是简答的一道面向过程的题,所以一上手就开始写代码,发现根本不对

​ 所以我准备静下心来,安心建模

建模

image-20211224101149591

没错,这道题就是一个表的模型

typedef struct{
	int set;
	int count[MAXSIZE];
}Record,table[MAXSIZE];   // 表的话每个就是记录

流程(伪代码)

  1. 输入n
  2. 输入n个数字,每当输入一个数的时候,在order里找一找有没有这个数字,如果没有加入进去
  3. 对order数组进行排序
  4. 输入第三行的n个数字
    1. 每当输入一个数字的时候,在table[].set中找一找有没有这个数字,没有的话加进去,位置为j
    2. 然后对于其上头的数字,在order中找到其对应的位置k,然后table[j].count[k]++
  5. 对table进行排序
  6. 按照格式输出table

代码

#include<iostream>
#include<cstring>
#define MAXSIZE 100
using namespace std;

typedef struct Node{
	int set;
	int count[MAXSIZE];
}Node;

int main(void){
//	freopen("input.txt", "r", stdin);
	int m;
	cin >> m;
	while(m-- > 0){
		int n;
		Node table[MAXSIZE];
		memset(table, 0, sizeof(table));
		cin >> n;
		int num1[n], order[n], ordercnt = 0;
		for(int i = 0; i < n; i++){
			cin >>num1[i];
			int j;
			for(j = 0; j < ordercnt && order[j] != num1[i]; j++);
			if(j == ordercnt)  //说明order里面没有这个序列 
				order[ordercnt++] = num1[i];
		}
		
		for(int i = 0; i < ordercnt-1; i++){
			int k = i;
			for(int j = i+1; j < ordercnt; j++)
				if(order[j] < order[k])
					k = j;
			if(k != i){
				int temp = order[k];
				order[k] = order[i];
				order[i] = temp;
			}
		}//给order排序了
		
		int set, setcnt = 0;
		for(int i = 0; i < n; i++){
			cin >> set;
//			cout << set << " ";  //这里值输入了第一个 
			int j;
//			for(int j = 0; j < setcnt && set != table[j].set; j++);
			for(j = 0; j < setcnt && set != table[j].set; j++); 
//			printf("%d %d", j, setcnt); 
			if(j == setcnt){
				//如果没找到
				table[setcnt++].set = set; 
			}// 先找到对应的set 
			// 不管找没找到,都插进去
			//先找到对应的位置
			int k;
//			for(int k = 0; num1[i] != order[k]; k++);
			for(k = 0; num1[i] != order[k]; k++);
			//找到num[i]对应的位置k
			table[j].count[k]++; 
//			printf("到达这里");
		} 
		// 再排序
		for(int i = 0; i < setcnt; i++)
//			printf("%d ", table[i].set);
//		cout<<endl;
		for(int i = 0; i < setcnt-1; i++){
			int k = i;
			for(int j = i + 1; j < setcnt; j++)
				if(table[j].set < table[k].set)
					k = j;
			if(k != i){
				Node temp = table[k];
				table[k] = table[i];
				table[i] = temp;
			}
		}
		// 输出 
		for(int i = 0; i < setcnt; i++){
			printf("%d={",table[i].set); //输出这个集合
			for(int j = 0; j < ordercnt; j++){
				printf("%d=%d", order[j], table[i].count[j]);
				if(j != ordercnt-1)
					putchar(',');
			}	
			printf("}\n"); 
//			if(i != setcnt-1)
//				putchar('\n');
		} 
		
	}
	
	return 0;
}
posted @ 2021-12-24 10:17  Crispy·Candy  阅读(218)  评论(0编辑  收藏  举报