acmclub2359(第二大数)
本题目题目链接:NEUQ OJ (acmclub.cn)http://oj.acmclub.cn/problems/2359
----------------------------------------------------------------------------------------------------------------------------
看到这个题目首先读题就废了大会功夫,但好歹是读懂了题目要求
两个Σ符号连用X(L,R),组成的是不同L与R的组合代表的范围,求每个范围内的第二大数,最后相加。以下是我自己写的代码:
!!!!!!!!!很傻很笨,警告(4重循环)空间及时间复杂度都太高
//第二大数
/*1.输入N(个数)第二行输入数字的排列(1-N) 数组a【】2.L,R的范围。俩个值比较后3.循环比较在(L,R)之中 第二大的数,将他用dec统计起来*/
//第二大数,在给定的所有(L,R)范围之中,每个范围的第二大的数之和
import java.util.Scanner;public class Dierdashu {public static void main(String []args){Scanner scanner=new Scanner(System.in);int N=scanner.nextInt();//记录数字排序int a[]=new int[N+1];for(int i=1;i<=N;i++){a[i]=scanner.nextInt();}//记录第二大数int dec=0;//求得每个(L,R)中的第二大数,L<Rfor(int L=1;L<=N-1;L++){for(int R=L+1;R<=N;R++){if(L<R){//复制相同的数字排序int b[]=new int[N+1];for(int i=1;i<=N;i++){b[i]=a[i];}//在(L,R)排序,找到第二大数for(int n=L;n<=R;n++){for(int m=L;m<R;m++){int max=b[m];if(b[m]>b[m+1]){b[m]=b[m+1];b[m+1]=max;}}}//排序之后第二大数为数组的第R-1个dec=dec+b[R-1]; }}}System.out.println(dec);}
}
当然啦,编译不通过哈哈哈,之后询问老师(不过思路是对的),还是乖乖的看答案,拿C转java运行吧!
要学习,蛮干不如先学习别人的思想~
以下是参考答案后的Java代码:
package acm_424;import java.util.Scanner;//第二大数,根据老师发的C答案理解编写
/*X(L,R)1.输入N,用a【】记录1-N2.设置三个量maxn,minn,ans,(在每次L+1,也就是R=L+1的时候初始化maxn,minn)(每次循环结束,R=N时根据不同情况,得出ans并累加)3.最后输出ans*/
public class Main {public static void main(String []args){Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();//输入int a[]=new int[n+1];for (int i = 1; i <= n; i++) {a[i]=scanner.nextInt();}//用于记录,最大数和第二大数int maxn=0,minn = 0;long ans=0;//for(int L=1;L<=n;L++){for(int R=L+1;R<=n;R++){//开始都是相同的L,所以当L=R+1的时候就初始化了第一个和第二个元素if(R==L+1){//开始范围内两个数,比较大小,并返回第二大的那个maxn=Math.max(a[L],a[R]);minn=Math.min(a[L],a[R]);ans+=minn; }else{/*范围内3个及以上数,也就是范围扩大,R向后移动,加入新数判断可能存在两种情况1.新数比第二大数大,比最大数小,第二大数变为a[R]2.新数比最大数大,最大数变为第二大数,新数变为最大数只需记录(L,R扩大)范围内的最大和第二大,其他不用比较*/if(a[R]>minn&&a[R]<maxn){minn=a[R];}else if(a[R]>maxn){minn=maxn;maxn=a[R];}ans+=minn;}}}System.out.println(ans);}}
--------------------------------------------------------------------------------------------------------------------------------与我自己写的相比,答案少了两层循环,利用了两个变量,在范围取值的移动上,进行记录。
理解第二大数,就只需要找到范围内第二大的数即可,无需把每个范围的数都排列一遍。
此外Math的方法,真的很方便!!!
acmclub2359(第二大数)相关推荐
- c语言经典算法——查找一个整数数组中第二大数
https://www.cnblogs.com/dootoo/p/4473958.html 题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大 ...
- 如何快速找出一个数组中最大数和第二大数
看到一道题是:快速找出一个数组中最大数和第二大数. 我之前学了一些数组排序,例如冒泡排序,简单选择排序等等,然后我就想可不可以利用冒泡排序来实现呢?之前写过冒泡排序实现从小到大的排列,那么可以改成从大 ...
- 快速找出一个数组中的最大数、第二大数
http://blog.csdn.net/hackbuteer1/article/details/8035261#comments 快速找出一个数组中的最大数.第二大数 思路:如果当前元素大于最大数 ...
- [基础题]1.快速找出一个数组中的最大数、第二大数。
[基础题]1.快速找出一个数组中的最大数.第二大数. package HomeWork_10;public class Test_01 {public static void main(String[ ...
- 面试题目(1)如何从一组数据中怎样最快找到第二大数?
首先定义max变量以存储最大值,secmax存储第二大的值.先取出数组中前两个值,将最大的存储在max中,小的存储在secmax中. 接下来 在循环中 取出数组的元素a[i].起初先判断a[i]是否是 ...
- 第二大数 滑动窗口 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
链接:https://ac.nowcoder.com/acm/contest/27302/F 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52 ...
- 寻找数组中的第二大数
方法一: #include "stdio.h" #include "stdlib.h" //初始化最大值为a[0],次大值为a[1],遍历一次,每次比较并更新最 ...
- 同时寻找最大数和最小数的最优算法 第二大数
我们知道,在一个容量为n的数据集合中寻找一个最大数,不管用什么样的比较算法,至少要比较n-1次,就算是用竞标赛排序也得比较n-1次,否则你找到的就不能保证是最大的数.那么,在一个容量为n的数据集合中同 ...
- html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。
2021-06-29:在两个都有序的数组中找整体第K小的数. 福大大 答案2021-06-29: 1.A和B长度不等的时候,需要把A和B的长度变成相等. A是短数组,B是长数组. 第k小的数,k从1开 ...
- 如何找出数组中第二大的数
1.最容易想到的办法 我们可以用最简单的办法来找到一个数组中任意大小的数字,那就是按照某一个排序方式将数组的所有元素进行排序,然后按需取出来就可以,知识这种方式的时间复杂度和空间复杂度比较大,所以,有 ...
最新文章
- MATLAB_8-边缘检测_大长腿干扰下识别人脸
- 机器视觉行业的现状和未来
- k8s查看pod的yaml文件_【大强哥-k8s从入门到放弃04】Yaml语法解析
- Android中实现照片滑动时左右进出的动画的xml代码
- WPF usercontrol 自定义依赖属性
- 数据结构——模式匹配kmp算法
- 从市场角度看服务器虚拟化
- “WPF” VS “Silverlight”
- excel两个指标相关性分析_我用Excel发现了数据分析的本质:回归分析
- Xen Documentation - Hypercall Interfaces
- 单调栈与单调队列简单例题
- Android_JarZip压缩和解压文件
- 校园二手交易平台-简要需求分析
- 中间表是什么?和报表有什么关系?会带来怎样的问题?又如何解决?
- 国内使用谷歌健身的方法
- HTML5视频自动循环播放
- 开课吧 python与人工智能 下载_开课吧app|开课吧手机版下载v2.3.6安卓版 - 欧普软件下载...
- 身份证OCR识别发展史
- free_rtos系统基本配置
- 倩女手游经验计算机,倩女幽魂手游卡级屯经验指南 短期反超成吨经验