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

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


问题描述#

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

输入格式

​ 输入第一行表示样例数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 @   Crispy·Candy  阅读(237)  评论(0编辑  收藏  举报
主题色彩
点击右上角即可分享
微信分享提示