7-2 寻找大富翁 (25分)

胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。

输入格式:

输入首先给出两个正整数N(≤10​6​​)和M(≤10),其中N为总人数,M为需要找出的大富翁数;接下来一行给出N个人的个人资产值,以百万元为单位,为不超过长整型范围的整数。数字间以空格分隔。

输出格式:

在一行内按非递增顺序输出资产排前M位的大富翁的个人资产值。数字间以空格分隔,但结尾不得有多余空格。

输入样例:

8 3
8 12 7 3 20 9 5 18

输出样例:

20 18 12

思路:

第三个点是N<M的情况,即将所有人非升序输出即可,如果不考虑这个点的话输出会格式错误!

代码:

最一个点内存超限,应该是内存给少了(64M),牛客网这道题内存给了128M,N的数量级是,过了

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;public class 寻找大富翁 {public static void main(String[] args) throws IOException {// TODO 自动生成的方法存根BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String str[]=br.readLine().split(" ");int N=Integer.parseInt(str[0]);int M=Integer.parseInt(str[1]);str=br.readLine().split(" ");long[] a=new long[N];for(int i=0;i<N;i++){a[i]=Integer.parseInt(str[i]);}Arrays.sort(a);if(M<=N){for(int i=1;i<M;i++){System.out.print(a[N-i]+" ");}System.out.println(a[N-M]);}else{ //N<M时只需要把所有人降序输出即可for(int i=1;i<N;i++){System.out.print(a[N-i]+" ");}System.out.println(a[0]);}}}

7-3 抢红包 (25分)

没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。

输入格式:

输入第一行给出一个正整数N(≤10​4​​),即参与发红包和抢红包的总人数,则这些人从1到N编号。随后N行,第i行给出编号为i的人发红包的记录,格式如下:

KN​1​​P​1​​⋯N​K​​P​K​​

其中K(0≤K≤20)是发出去的红包个数,N​i​​是抢到红包的人的编号,P​i​​(>0)是其抢到的红包金额(以分为单位)。注意:对于同一个人发出的红包,每人最多只能抢1次,不能重复抢。

输出格式:

按照收入金额从高到低的递减顺序输出每个人的编号和收入金额(以元为单位,输出小数点后2位)。每个人的信息占一行,两数字间有1个空格。如果收入金额有并列,则按抢到红包的个数递减输出;如果还有并列,则按个人编号递增输出。

输入样例:

10
3 2 22 10 58 8 125
5 1 345 3 211 5 233 7 13 8 101
1 7 8800
2 1 1000 2 1000
2 4 250 10 320
6 5 11 9 22 8 33 7 44 10 55 4 2
1 3 8800
2 1 23 2 123
1 8 250
4 2 121 4 516 7 112 9 10

输出样例:

1 11.63
2 3.63
8 3.63
3 2.11
7 1.69
6 -1.67
9 -2.18
10 -3.26
5 -3.26
4 -12.32

思路:

题目的主要难点在于各种情况的排序,所以自己建一个类存放各种属性并继承Comparable接口,再利用Arrays类的sort来排序就很简单了!之前没用DecimalFormat保留两位小数,所以一直答案错误!注意DecimalFormat里的格式要写成"0.00",只写".00"的话,遇到结果是0的情况不会输出0.00,而是输出.00会造成答案错误!

反例(格式为".00"的错误情况):输入:

2
1 2 5
1 1 5

 输出(错误):

1 .00
2 .00

代码:

import java.text.DecimalFormat;
import java.util.*;
public class 抢红包 {public static void main(String[] args) {// TODO 自动生成的方法存根Scanner in =new Scanner(System.in);DecimalFormat df=new DecimalFormat("0.00");//保留小数点后两位int N=in.nextInt();in.nextLine();Person[] p=new Person[N+1];//对象数组for(int i=1;i<=N;i++){p[i]=new Person();p[i].number=i;}String str;for(int i=1;i<=N;i++){String a[];str=in.nextLine();a=str.split(" ");for(int j=1;j<a.length;j+=2){//每两个数据一对,个人编号int n=Integer.parseInt(a[j]);//抢到红包的人的编号double money=Double.parseDouble(a[j+1]);//此次抢到的红包金额p[n].earn+=money;p[n].redNum++;//第n个人抢到红包数加1p[i].earn-=money;//发红包的人支出}}for(int i=1;i<=N;i++){p[i].earn/=100.0;    }Arrays.sort(p,1,N+1);for(int i=1;i<=N;i++){System.out.println(p[i].number+" "+df.format(p[i].earn));}}}
class Person implements Comparable<Person>{public double earn;public int redNum;public int number;@Overridepublic int compareTo(Person o) {// TODO 自动生成的方法存根if(this.earn==o.earn){//若收入相等,比较收到的红包数if(this.redNum==o.redNum){if(this.number>o.number){return 1;}else{return -1;}}else if(this.redNum>o.redNum){return -1;//递减}else{return 1;}}else if(this.earn>o.earn){return -1;}else{return 1;}}
}

7-5 喊山 (30分)

喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)

一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方。

输入格式:

输入第一行给出3个正整数nmk,其中n(≤10000)是总的山头数(于是假设每个山头从1到n编号)。接下来的m行,每行给出2个不超过n的正整数,数字间用空格分开,分别代表可以听到彼此的两个山头的编号。这里保证每一对山头只被输入一次,不会有重复的关系输入。最后一行给出k(≤10)个不超过n的正整数,数字间用空格分开,代表需要查询的山头的编号。

输出格式:

依次对于输入中的每个被查询的山头,在一行中输出其发出的呼喊能够连锁传达到的最远的那个山头。注意:被输出的首先必须是被查询的个山头能连锁传到的。若这样的山头不只一个,则输出编号最小的那个。若此山头的呼喊无法传到任何其他山头,则输出0。

输入样例:

7 5 4
1 2
2 3
3 1
4 5
5 6
1 4 5 7

输出样例:

2
6
4
0

思路:

这是一道图论题,每个山头最多有两个能听到它的临近山头意味着一个节点的出度最多有2个。而且最多有10000个节点。如果用邻接矩阵存储图会爆空间。因此我们选择邻接表
题意就是让我们求图(一个节点就两个出度,也就是一个二叉树)的深度,即最长路径。对于无权图,可以想到用dfs或者bfs搜到最深的地方,不过分析一下样例,<1,2>, <2,3>, < 3,1>,访问1的最大深度是1而不是2,如果用dfs搜就会搜到2,因为dfs是搜的1-2-3;如果用bfs就会搜到1,bfs搜的是1-2,1-3. 因此我们用bfs做

代码:

学习BFS请戳这里

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class 喊山 {static int vis[]=new int[10005];//初始化时自动全为0static Queue<Integer> q=new LinkedList<Integer>();static int bfs(int u,ArrayList<Integer>[] list,int mi,int mi1){q.offer(u);vis[u]=1;//标记已经用过,1代表第一个山头走了while(!q.isEmpty()){u=q.poll();if(vis[u]>=mi){//至少得走过两个山头if(vis[u] > mi)//更新mi, mi1{mi = vis[u];mi1 = u;}else{mi1 = Math.min(u, mi1);//取最小编号的山头}}for(int i = 0; i < list[u].size(); i++){if(vis[(Integer) list[u].get(i)]==0)//为0代表没有走过{q.offer((Integer) list[u].get(i));//入队列vis[(Integer) list[u].get(i)] = vis[u] + 1;//更新vis值}}} return mi1;}public static void main(String[] args) {// TODO 自动生成的方法存根Scanner in=new Scanner(System.in);int mi,mi1;int n=in.nextInt();int m=in.nextInt();int k=in.nextInt();ArrayList<Integer>[] list=new ArrayList[10005]; for(int i=1;i<=n;i++){list[i]=new ArrayList<Integer>();}for(int i=0;i<m;i++){int t1=in.nextInt();int t2=in.nextInt();list[t1].add(t2);list[t2].add(t1);}while((k--)>0){mi=2;mi1=10005;for(int i=1;i<=n;i++){vis[i]=0;}int u=in.nextInt();mi1=bfs(u,list,mi,mi1);if(mi1==10005){System.out.println(0);}else{System.out.println(mi1);}}}}

7-8 最长对称子串 (25分)

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:

Is PAT&TAP symmetric?

输出样例:

11

思路:

思路比较简单,双重循环遍历出所有字串,再根据字串的长度(偶数或奇数)来分情况讨论。注意一个字符或所有字符都不相同时的情况,应该输出1,所以j要从i开始!!!

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class 最长对称子串 {public static void main(String[] args) throws IOException {// TODO 自动生成的方法存根BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String str=br.readLine();int L=str.length();//既是字符数量也是最后一个字符的坐标int result=0;for(int i=0;i<L;i++){for(int j=i;j<L;j++){if((j-i+1)%2==1){//奇数int flag=1;int count=0;for(int k=i;k<(j+i)/2;k++,count++){if(str.charAt(k)!=str.charAt(j-count)){flag=0;break;}}if(flag==1){if(result<(j-i+1)){result=j-i+1;}}}else{//偶数int flag=1;int count=0;for(int k=i;k<(j+i)/2+1;k++,count++){if(str.charAt(k)!=str.charAt(j-count)){flag=0;break;}}if(flag==1){if(result<(j-i+1)){result=j-i+1;}}}}}System.out.println(result);}}

7-9 点赞狂魔 (25分)

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。

输入格式:

输入在第一行给出一个正整数N(≤100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name K F​1​​⋯F​K​​”,其中Name是不超过8个英文小写字母的非空用户名,1≤K≤1000,F​i​​(i=1,⋯,K)是特性标签的编号,我们将所有特性标签从 1 到 10​7​​ 编号。数字间以空格分隔。

输出格式:

统计每个人点赞的不同标签的数量,找出数量最大的前3名,在一行中顺序输出他们的用户名,其间以1个空格分隔,且行末不得有多余空格。如果有并列,则输出标签出现次数平均值最小的那个,题目保证这样的用户没有并列。若不足3人,则用-补齐缺失,例如mike jenny -就表示只有2人。

输入样例:

5
bob 11 101 102 103 104 105 106 107 108 108 107 107
peter 8 1 2 3 4 3 2 5 1
chris 12 1 2 3 4 5 6 7 8 9 1 2 3
john 10 8 7 6 5 4 3 2 1 7 5
jack 9 6 7 8 9 10 11 12 13 14

输出样例:

jack chris john

思路:

类排序。其中用到了Set去重。

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;public class 点赞狂魔 {public static void main(String[] args) throws NumberFormatException, IOException {// TODO 自动生成的方法存根BufferedReader br=new BufferedReader(new InputStreamReader(System.in));int N=Integer.parseInt(br.readLine());//正整数Person p[]=new Person[N];for(int i=0;i<N;i++){Set<String> set=new TreeSet<String>();p[i]=new Person();String str[]=br.readLine().split(" ");p[i].name=str[0];p[i].num=Integer.parseInt(str[1]);for(int j=2;j<p[i].num+2;j++){set.add(str[j]);}p[i].label=set.size();p[i].avg=(double)p[i].num/p[i].label;}Arrays.sort(p);
//        for(int i=0;i<N;i++){
//          System.out.println(p[i].name+p[i].label+" "+p[i].avg);
//        }if(N==2){System.out.println(p[0].name+" "+p[1].name+" "+"-");}else if(N==1){System.out.println(p[0].name+" "+"-"+" "+"-");}else{//N>=3System.out.println(p[0].name+" "+p[1].name+" "+p[2].name);}}}
class Person implements Comparable<Person>{String name;int num;int label;//去重后的点赞数double avg;@Overridepublic int compareTo(Person o) {// TODO 自动生成的方法存根if(this.label>o.label){//降序return -1;}else if(this.label<o.label){return 1;}else{//并列if(this.avg>o.avg){//输出标签出现次数平均值最小的那个,所以升序return 1;}else{return -1;}}}
}

7-10 两个有序序列的中位数 (30分)

已知有两个非降序序列S1, S2, 求S1与S2归并成一个序列的低位中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。

输入格式:

输入分4行。第一行给出第一个序列的长度N1(0<N1≤2500000),随后是第一个序列的信息,即N1个非降序排列的整数。数字用空格间隔。随后是第二个序列的长度N2(0<N2≤2500000)和信息。因为测试数据只能10M,2.5*10的6次方规模,二分效果不明显,如果10的7次方数据规模,二分一般比归并快20ms左右。10的8次方快近200多ms。题目主要是输入花费大量的时间,如查找出现超时,尝试多次提交。

输出格式:

在一行中输出两个输入序列的并集序列的低位中位数。

输入样例:2

在这里给出一组输入。例如:

3
1 2 3
5
4 5 6 7 8

输出样例:

在这里给出相应的输出。例如:

4

思路:

直接排序。。woc这么暴力

不知道为啥用列表只有最后一个点内存超限,而用数组却没一个点对。。救我?

代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;public class 两个有序序列的中位数 {public static void main(String[] args){Scanner sc=new Scanner(System.in);ArrayList<Integer> list=new ArrayList<Integer>();int n=sc.nextInt();for(int i=0;i<n;i++)list.add(sc.nextInt());int m=sc.nextInt();for(int i=0;i<m;i++)list.add(sc.nextInt());Collections.sort(list);//System.out.println(list.toString());System.out.println(list.get((n+m-1)/2));}
}

7-11 单身狗 (25分)

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:

输入第一行给出一个正整数 N(≤50000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤10000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。

输出格式:

首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。

输入样例:

3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333

输出样例:

5
10000 23333 44444 55555 88888

思路:

水题,不过要注意做题时注意临界点的判断与思考!

代码:

import java.util.*;
public class 单身狗 {public static void main(String[] args) {// TODO 自动生成的方法存根Scanner in=new Scanner(System.in);int N=in.nextInt();int[] a=new int[100000];//注意极值点for(int i=0;i<N;i++){int b=in.nextInt();int c=in.nextInt();a[b]=c;a[c]=b;}int M=in.nextInt();ArrayList<Integer> list=new ArrayList<Integer>();int[] enter=new int[M];for(int i=0;i<M;i++){enter[i]=in.nextInt();}for(int i=0;i<M;i++){int flag=0;for(int j=0;j<M;j++){if(j!=i&&enter[j]==a[enter[i]]){flag=1;//不是单身break;}}if(flag==0){list.add(enter[i]);}}System.out.println(list.size());Collections.sort(list);for(int i=0;i<list.size()-1;i++){System.out.print(list.get(i)+" ");}System.out.println(list.get(list.size()-1));}}

Winter Vacation Training(5st Week)相关推荐

  1. ECJTUACM16 Winter vacation training #5 题解源码

    A------------------------------------------------------------------------------------------- 题目链接:ht ...

  2. ECJTUACM16 Winter vacation training #4 题解源码

    https://vjudge.net/contest/149692#overview 这周一VJ比赛,题解&源码已完成! A.................................. ...

  3. 2020 GDUT Winter Personal Training Contest I (Div. 2) B - Divisors of Two Integers题解

    原题 题目大意 给出一段数,这些数字是两个数的所有因数,找回这两个数 题目分析 简单分析一下可以发现最大的数一定是其中一个答案(花了10min意识到),然后就很简单了,去掉一个数的所有因子,剩下最大的 ...

  4. 高中英语试验修订本(第一册)上(人教版)

    393 words: introduce-I want to introduce my friend Jane oral-We will have an oral test in class this ...

  5. Daily record-December

    December 1 1. All circles have the same shape. 所有圆的形状都是相同的. 2. She first drew a circle on the board. ...

  6. 英文最基本的五个时态

    英文最常用的时态有五个:一般现在时:现在进行时:一般过去时:一般将来时和现在完成时.  一. 一般现在时:  用动词原型表示,但单数第三人称后要加-s,在词尾加-s时要注意:  1. 一般情况:加-s ...

  7. 计算机科学与技术 英文简历,计算机科学与技术类专业英文简历模板

    计算机科学与技术类专业英文简历 时间:2017-03-01 12:00:00 计算机科学与技术类专业英文简历模板 Basic CV Name: xxx nationality: China Curre ...

  8. Python最常用的函数、基础语句有哪些?

    作者 | 朱卫军 来源 | Python大数据分析 Python有很多好用的函数和模块,这里给大家整理下我常用的一些方法及语句. 一.内置函数 内置函数是python自带的函数方法,拿来就可以用,比方 ...

  9. linuxsed替换字符串后保存_字符串方法——replace()

    1.字符串方法-- replace() str.replace(old, new[,max]) 参数说明(Parameters) old:被替换的字符串 new:新字符串,替换原来的old字符串 ma ...

  10. 树莓派利用Django搭建聊天网页服务器 —— 准备篇

    利用Django在树莓派上搭建一个聊天网页服务器,话不多说,直接上流程. 首先来看一下刚创建的Django项目文件结构: 项目文件配置 setting.py配置 第一个我们先来看一下setting.p ...

最新文章

  1. Python3--爬取海词信息
  2. python内建集合模块collections功能,计数,有序,双向队列
  3. 玩转mini2440开发板之【编译u-boot提示没有规则可以创建“XX.o”需要的目标】
  4. MaxCompute Tunnel上传典型问题场景
  5. 提取多个字段_动态合并多个工作表,数据再多也不怕
  6. 逐条驳斥天猫精灵抄袭说?百度钱晨解秘小度Play设计
  7. 备份域控制器AD 保护的最佳实践(第 1 部分)
  8. 转:Android View.post(Runnable )
  9. ASP.NET中用healthMonitor属性用法
  10. Qt 简单的视频播放器
  11. xcode打包cordova项目生成ipa
  12. 裁员,缩招,冻结HC,程序员如何应对?
  13. 基于simulink的有源功率因数校正(APFC) 系统的性能仿真
  14. Ubuntu18.04配置运行Kintinuous
  15. 类和对象7:构造和析构方法
  16. 大数据部门的作用与大数据工程师的工作
  17. JAVA:日期时间范围查询0点到23点59分59秒之间
  18. win7 无法开启启用网络发现
  19. 字节飞书提前批一面(凉的透透的)
  20. 【bootstrap教程】Bootstrap 工具提示(Tooltip)插件

热门文章

  1. 剑指Offer(第二版)面试案例:树中两个节点的最低公共祖先节点
  2. 计算机建立局域网共享,局域网两台电脑如何建立共享文件夹
  3. 智能电视聚好看连接服务器失败,海信电视网络异常解决办法
  4. antd系列之Select
  5. 大学往事 第五章 计算机班的女生
  6. python数独游戏
  7. 一项采用MasimoO3(R)的前瞻性研究就通气抢救疗法对COVID-19患者脑氧合的效应进行了深入探查
  8. matlab贝塔分布,怎么拟合贝塔分布函数
  9. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program.
  10. Web应用服务器——Tomcat的介绍、下载安装、环境配置与使用