题目来源:
PTA-L1-034
***题目:**加粗样式
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。
输入格式:
输入在第一行给出一个正整数N(≤1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为“K F1⋯FK”,其中1≤K≤10,Fi(i=1,⋯,K)是特性标签的编号,我们将所有特性标签从1到1000编号。数字间以空格分隔
输出格式:
统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。
输入样例:
4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123
输出样例:
233 3
菜鸡开始的思路:
先将数据存入数组,排序后记录各位数字的个数,并分别将个数和该数据存在结构体中,然后结构体排序
菜鸡的开始代码(71行):
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[100];
struct note
{
int x;
int y;
};
int main()
{
struct note que[100];
int n,i=0,k=0;
cin>>n;
//读入数据
while(n--)
{
int m;
cin>>m;
while(m--)
{
cin>>a[i];
i++;
}
}
sort(a,a+i);
// for(int m=0;m<i;m++)
// cout<<a[m]<<" ";
//cout<<endl;
//读取数据并计数
int num=1;
for(int j=0;j<i;j++)
{
if(a[j]==a[j+1])
{
num++;
continue;
}
else
{
que[k].x=a[j];
que[k].y=num;
// cout<<que[k].x<<" ";
k++;
num=1;
}
}
//结构体排序
for(int j=0;j<k-1;j++)
{
for(int l=j;l<k-1;l++)
{
if(que[l].y>que[l+1].y)
{
swap(que[l].x,que[l+1].x);
swap(que[l].y,que[l+1].y);
}
else if(que[l].y==que[l+1].y)
{
if(que[l].x>que[l+1].x)
{
swap(que[l].x,que[l+1].x);
}
}
}
}
cout<<que[k-1].x<<" "<<que[k-1].y;
return 0;
}
后来改进后的思路:
由于数据是小于1000的,那输入数据时记录最大值,并遍历后记录出现频率最大的数字即可,类似于桶排序
参考代码(30行)
#include<iostream>
using namespace std;
int a[1001]={0};
int main()
{
int n,m,x,mnum=0,num,k=0;//mnum用来计数记录最大值
//读取数据
cin>>n;
while(n--)
{
cin>>m;
for(int i=0;i<m;i++)
{
cin>>x;
x>k?k=x:k;
a[x]++;
}
}
//cout<<k<<endl;
for(int i=0;i<=k;i++)
{
if(a[i]>=mnum)
{
mnum=a[i];
num=i;
}
}
cout<<num<<" "<<mnum;
return 0;
}