分组统计(表,查找,边插入边排序)
分组统计(表,查找,边插入边排序)
问题描述#
先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。
输入格式
输入第一行表示样例数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的集合中
思路#
第一次做这道题的时候我就想这是简答的一道面向过程的题,所以一上手就开始写代码,发现根本不对
所以我准备静下心来,安心建模
建模#
没错,这道题就是一个表的模型
typedef struct{
int set;
int count[MAXSIZE];
}Record,table[MAXSIZE]; // 表的话每个就是记录
流程(伪代码)#
- 输入n
- 输入n个数字,每当输入一个数的时候,在order里找一找有没有这个数字,如果没有加入进去
- 对order数组进行排序
- 输入第三行的n个数字
- 每当输入一个数字的时候,在table[].set中找一找有没有这个数字,没有的话加进去,位置为j
- 然后对于其上头的数字,在order中找到其对应的位置k,然后table[j].count[k]++
- 对table进行排序
- 按照格式输出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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步