题目描述 给你一个序列a1,a2...an,每个数单独统计它出现的次数,统计完成后,按照出现次数排序,请你计算出这个序列里出现第一多的数和出现第二多的数的分别出现的次数 出现次数排序中数c在数d前面的定义是数c的出现次数a >= 数d的出现次数b。换言之,假如出现第一多的数c出现的个数为a,出现第二多的数d出现次数为b,(c不等于d)那么ab之间满足a >= b 例如,如果在一个序列中2出现了3次,1也出现了3次,而其他数字出现的次数都小于3,那么我们认为整个序列中出现第一多的数的次数为3,出现第二多的数出现次数也为3 输入 第一行一个正整数t,表示有t组数据 每一组第一行一个正整数n,表示序列长度为n 每一组第二行,输入n个正整数 序列长度最大不超过100,序列中的最大数不会超过100,最小不会小于1 输出 序列当中第一多和第二多的数的个数 用c语言数组写代码
时间: 2023-09-18 14:08:02 浏览: 174
```c
#include<stdio.h>
#define MAXN 105
int a[MAXN], cnt[MAXN];
int main(){
int t, n;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
cnt[a[i]]++;
}
int max1 = 0, max2 = 0;
for(int i = 1; i <= 100; ++i){
if(cnt[i] > cnt[max1]){
max2 = max1;
max1 = i;
}
else if(cnt[i] > cnt[max2] && cnt[i] != cnt[max1]){
max2 = i;
}
}
printf("%d %d\n", cnt[max1], cnt[max2]);
for(int i = 1; i <= n; ++i){
cnt[a[i]] = 0;
}
}
return 0;
}
```
相关问题
C语言题目描述 给你一个序列a1,a2...an,每个数单独统计它出现的次数,统计完成后,按照出现次数排序,请你计算出这个序列里出现第一多的数和出现第二多的数的分别出现的次数 出现次数排序中数c在数d前面的定义是数c的出现次数a >= 数d的出现次数b。换言之,假如出现第一多的数c出现的个数为a,出现第二多的数d出现次数为b,(c不等于d)那么ab之间满足a >= b 例如,如果在一个序列中2出现了3次,1也出现了3次,而其他数字出现的次数都小于3,那么我们认为整个序列中出现第一多的数的次数为3,出现第二多的数出现次数也为3 输入 第一行一个正整数t,表示有t组数据 每一组第一行一个正整数n,表示序列长度为n 每一组第二行,输入n个正整数 序列长度最大不超过100,序列中的最大数不会超过100,最小不会小于1 输出 序列当中第一多和第二多的数的个数
以下是 C 语言的实现:
```c
#include<stdio.h>
#include<string.h>
#define MAX_N 100
int t, n;
int a[MAX_N + 5];
int cnt[MAX_N + 5], top1, top2;
int main() {
scanf("%d", &t);
while(t--) {
memset(cnt, 0, sizeof(cnt));
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
cnt[a[i]]++;
}
top1 = top2 = 0;
for(int i = 1; i <= MAX_N; i++) {
if(cnt[i] >= cnt[top1]) {
top2 = top1;
top1 = i;
} else if(cnt[i] > cnt[top2]) {
top2 = i;
}
}
printf("%d %d\n", cnt[top1], cnt[top2]);
}
return 0;
}
```
思路解析:
这道题需要统计每个数在序列中出现的次数,可以使用一个数组 $cnt$ 来记录。然后遍历一遍 $cnt$ 数组,找出出现次数最多的数和出现次数次多的数即可。
C语言编写程序:题目描述 给你一个序列a1,a2...an,每个数单独统计它出现的次数,统计完成后,按照出现次数排序,请你计算出这个序列里出现第一多的数和出现第二多的数的分别出现的次数 出现次数排序中数c在数d前面的定义是数c的出现次数a >= 数d的出现次数b。换言之,假如出现第一多的数c出现的个数为a,出现第二多的数d出现次数为b,(c不等于d)那么ab之间满足a >= b 例如,如果在一个序列中2出现了3次,1也出现了3次,而其他数字出现的次数都小于3,那么我们认为整个序列中出现第一多的数的次数为3,出现第二多的数出现次数也为3 输入 第一行一个正整数t,表示有t组数据 每一组第一行一个正整数n,表示序列长度为n 每一组第二行,输入n个正整数 序列长度最大不超过100,序列中的最大数不会超过100,最小不会小于1 输出 序列当中第一多和第二多的数的个数
以下是这道题的C语言解法,请参考:
```c
#include <stdio.h>
int cnt[101]; // 计数数组
int main()
{
int t;
scanf("%d", &t);
while (t--) {
int n, max_cnt = 0, max_num, second_cnt = 0, second_num;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
cnt[x]++; // 统计每个数出现的次数
if (cnt[x] > max_cnt) { // 更新第一多的数
second_cnt = max_cnt;
second_num = max_num;
max_cnt = cnt[x];
max_num = x;
} else if (cnt[x] > second_cnt && x != max_num) { // 更新第二多的数
second_cnt = cnt[x];
second_num = x;
}
}
printf("%d %d\n", max_cnt, second_cnt);
for (int i = 1; i <= 100; i++) { // 清空计数数组
cnt[i] = 0;
}
}
return 0;
}
```
解析如下:
1. 首先读入数据组数`t`。
2. 对于每一组数据,定义一个计数数组`cnt`,初始化为0。
3. 读入序列中的每个数,同时在计数数组`cnt`中对应的元素加1。
4. 维护两个变量`max_cnt`和`second_cnt`分别表示第一多和第二多数出现的次数,`max_num`和`second_num`分别表示第一多和第二多数本身。
5. 每次读入一个数后,更新第一多和第二多数,注意要排除第二多数等于第一多数的情况。
6. 输出第一多和第二多数出现的次数。
7. 清空计数数组。
8. 注意每组数据输出完后要换行。
阅读全文