7-20 悄悄关注 (25 分)
新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列表和其对其他用户的点赞情况,扒出有可能被其悄悄关注的人。
输入格式:
输入首先在第一行给出某用户的关注列表,格式如下:
人数N 用户1 用户2 …… 用户N
其中N
是不超过5000的正整数,每个用户i
(i
=1, ..., N
)是被其关注的用户的ID,是长度为4位的由数字和英文字母组成的字符串,各项间以空格分隔。
之后给出该用户点赞的信息:首先给出一个不超过10000的正整数M
,随后M
行,每行给出一个被其点赞的用户ID和对该用户的点赞次数(不超过1000),以空格分隔。注意:用户ID是一个用户的唯一身份标识。题目保证在关注列表中没有重复用户,在点赞信息中也没有重复用户。
输出格式:
我们认为被该用户点赞次数大于其点赞平均数、且不在其关注列表上的人,很可能是其悄悄关注的人。根据这个假设,请你按用户ID字母序的升序输出可能是其悄悄关注的人,每行1个ID。如果其实并没有这样的人,则输出“Bing Mei You”。
输入样例1:
10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60
输出样例1:
Ammy
Cath
Pota
输入样例2:
11 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao Pota
7
Magi 50
Pota 30
LLao 48
Ammy 3
Dave 15
GAO3 31
Zoro 29
输出样例2:
Bing Mei You
思路:
此题:想法很简单:本想用map后来感觉map也不一定简单,所以还是用的最基础的数组来实现。
首先:抓住重点,第一行是连续输入,也就是一个字符串。而这个字符串中是否包含接下来我所输入的人名,如果不包含,并且它的点赞数也大于其平均数,就排序输出否则输出bing mie you.
解法一:用一个字符串数组来存放人名,一个整数数组来存放它的点赞数,然后满足条件加入集合中 ArrayList 然后调用排序方法,最后输出。
解法er:前面相同,然后是用TreeSet 来存放满足条件不用实现排序方法了。这里我强调一下,就是两种方式最后一个测试点都是超时。本想着用自定义构造方法来实现,发现依旧超时。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader sr = new BufferedReader(new InputStreamReader(System.in));
String s = sr.readLine(); //输入的一行带有多少个人,以及有多少个人名
String string [] = s.split(" "); //这时候开始对空格进行分割
int m = Integer.parseInt(string[0]); //拿出第一个数字,也就是多少个人
StringBuffer sss = new StringBuffer(); // 定义一个字符串 拿出除了输入的个数的那些人名
for(int i=1;i<string.length;i++) {
sss.append(string[i]+" "); //得到 出一开始输入的总数,的人名
}
String ss = sss.toString(); //转换为字符串
//拿出出个数以外的人名
ArrayList list = new ArrayList(); // 定义集合引用
int n = Integer.parseInt(sr.readLine()); //第二次输入的个数 多少人名 和 点赞数
int sum =0,avg=0; //总和 平均数
int nums[] = new int[n]; //整数数组
String attr[] = new String[n]; //第二次的人名
for(int i=0;i<n;i++) {
String line[] = sr.readLine().split(" "); //第一行输入的是一个字符串 包含 人名 和点赞数
attr[i] = line[0];//第二次输入的人名
nums[i]=Integer.parseInt(line[1]); //每个人名对应的点赞
sum=sum+nums[i]; // 对其求和
}
avg = sum/n; //求平均
for(int i=0;i<n;i++) {
if(!ss.contains(attr[i])&&nums[i]>avg) {
list.add(attr[i]); //满足条件 添加到集合中
}
}
Collections.sort(list); //排序
if(list.size()>0) {
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}else {
System.out.println("Bing Mei You");
}
}
}
解法二:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader sr = new BufferedReader(new InputStreamReader(System.in));
String s = sr.readLine(); //输入的一行带有多少个人,以及有多少个人名
String string [] = s.split(" ");
int m = Integer.parseInt(string[0]);
StringBuffer sss = new StringBuffer();
for(int i=1;i<string.length;i++) {
sss.append(string[i]+" ");
}
String ss = sss.toString();
TreeSet<String> set = new TreeSet<String>();
String names[] = ss.split(" "); //把各个名字存进字符串数组当中
int n = Integer.parseInt(sr.readLine());
int sum =0,avg=0;
int nums[] = new int[n];
String attr[] = new String[n];
for(int i=0;i<n;i++) {
String line[] = sr.readLine().split(" ");
attr[i] = line[0];//第二次输入的人名
nums[i]=Integer.parseInt(line[1]); //每个人名对应的关注度
sum=sum+nums[i];
}
avg = sum/n;
for(int i=0;i<n;i++) {
if(!ss.contains(attr[i])&&nums[i]>avg) {
set.add(attr[i]);
}
}
if(set.size()>0) {
for (String string2 : set) {
System.out.println(string2);
}
}else {
System.out.println("Bing Mei You");
}
}
}