任务要求
实训描述
朋友圈有一个点赞功能,你可以为你喜欢的文章点赞表示支持。每篇文章都可以根据其内容给出一些标签,这些标签用数字表示(如:1 代表心灵鸡汤、2 代表政治、3 代表经济、…),你点赞的文章的类型,也间接反应了你的喜好。
本关任务:编写一个完整的程序,通过统计一个人点赞的纪录,分析这个人的喜好。
输入格式及编程要求
第一行输入一个正整数 N ( N < 1000 ),是该用户点赞的文章数量。
随后的 N 行,每行给出一篇被其点赞的文章的标签描述,格式为“k S1 S2 … Sk ”。
k表示该文章的标签数,1≤k≤10,即每篇文章最多10个标签;
Sk是标签,是1到1000之间的整数,即总共有不超过1000种标签。
所有数值之间以空格分隔。
例子
1. 4
2. 3 889 233 2
3. 5 100 3 233 2 73
4. 4 3 73 889 2
5. 2 233 123
应输出结果为
233 3
基本思路
所用知识
1.数组
数组详情请见CSDN其他帖子或各类书籍
2.循环
循环方式详情请见CSDN其他帖子或者各类书籍
3.输入方式
同上
思路描述
首先,题目先给的输入是有几篇文章,即是告诉我们最开始对每篇文章获取其标签信息循环的多少。
而对于下面的每个输入行来说,其第一个为这篇文章的标签数,则可以告知我们在此嵌套循环中的循环最大值。
具体实现
为可以进行一一对应的处理,我们利用数组,对于二元数组或者是两个数组来说,其处理一般需要两个循环,对于初学者可能转不过来且麻烦,我们可以只用一个一元数组进行处理。
题目中提示我们,标签数不会超过1000,因此我们可以利用一个1001位(或更大些。但是注意小心溢出)的数组
int a[1010] = {0};
这里直接进行了一个初始化,为后续方便大小的比较;
而对于输入来说
先确定最外圈循环的次数,即是共点赞几篇文章
int n;
std::cin>>n; //输入第一个数,即是阅读文章的数量
while(n--)
{
...
}
此处用n–递减进行循环,这里的每个循环内部应是对每篇文章的处理
再在此循环内添加输入并对文章的标签进行处理
while(n--)
{
cin>>x;
for(i=0;i<x;i++)
{
cin>>t;
a[t]++;
}
}
这里则是利用数组的索引作为每篇文章的标签对应的数字,然后利用其对应,每次索引到这位便可以+1
最后是用于检索全部文章得到数据后的一个找最多出现次数的历遍循环找出最大的。
for(i=0;i<1010;i++)
{
if(a[i]>=max)
{
lab=i;
max = a[i];
}
}
需要注意的是
这里进行条件判断的时候要使用大于等于,由于题目要求是若是同一出现次数下,输出标签数字最大的,我们可以直接利用循环进行一个全部的比较。
写在最后
代码仍有不完整的地方,恳请各位大佬斧正,作为刚入C语言的小白,第一次发个帖也算是证明自己学有所成。
最后是完整代码
完整代码
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int n,x,i,lab,t;
int max=0;
int a[1010]={0};
cin>>n;
while(n--)
{
cin>>x;
for(i=0;i<x;i++)
{
cin>>t;
a[t]++;
}
}
for(i=0;i<1010;i++)
{
if(a[i]>=max)
{
lab=i;
max = a[i];
}
}
printf("%d %d",lab,max);
return 0;
}