找第K大数(ACdream 1099)

2024-09-07 18:38
文章标签 大数 acdream 1099

本文主要是介绍找第K大数(ACdream 1099),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

瑶瑶的第K大

Time Limit: 4000/2000MS (Java/Others)  Memory Limit: 256000/128000KB (Java/Others)
Submit  Statistic  Next Problem
Problem Description

一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩。可是你们都不知道玩什么。。。尴尬了一阵子,机智的瑶瑶就提议:“这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 大的数字。”

Input

第1行 两个整数N, K以空格隔开;

第2行 有N个整数(可出现相同数字,均为随机生成),同样以空格隔开。

0 < n ≤ 5*10^6 , 0 < k ≤ n

1 ≤ xi ≤ 10^8

Output
输出第  大的数字。
Sample Input
5 2
5 4 1 3 1
Sample Output
4
Hint
如2,2,1中三个数字中第一大数字为2,第二大数字也为2,第三大数字为1 。
Source
tsyao
Manager
tsyao

读入要优化,否则TLE

1:STL函数实现

2:快排思想实现

#include <bits/stdc++.h>
#define N 6000010
int a[N];
int n,k;int input()
{int ans=0;char a;while((a=getchar())<'0'||a>'9');ans=a-'0';while((a=getchar())>='0'&&a<='9'){ans=ans*10+a-'0';}return ans;
}int solve(int l, int r)
{if(l == r) return a[l];int i = l, j = r, temp = a[l];if(l < r){while(i < j){while(i < j && a[j] < temp) j--;if(i < j) a[i++] = a[j];while(i < j && a[i] > temp) i++;if(i < j) a[j--] = a[i];}a[i] = temp;if(i == k) return a[i];else if(i < k)  solve(i+1,r);else solve(l,i-1);}
}int main()
{#ifdef xxzfreopen("in.txt","r",stdin);#endif // xxzn = input();k = input();for(int i = 1; i <= n; i++) a[i] = input();printf("%d\n",solve(1,n));return 0;
}

利用STL实现

#include<iostream>
#include <algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<cstdio>
using namespace std;
const int N = 11111111;void scan_d(int &ret)
{char c;ret = 0;while((c=getchar())<'0' || c>'9');while(c>='0'&&c<='9') ret = ret*10 +(c-'0'),c=getchar();
}
int a[N];
int main()
{int n,k;cin>>n>>k;for(int i = 0 ; i<n;i++){scan_d(a[i]);}nth_element(a,a+n-k,a+n);cout<<a[n-k]<<endl;
}


这篇关于找第K大数(ACdream 1099)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145848

相关文章

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,

ACdream区域赛指导赛之手速赛系列(4)

点击打开题目链接 #include <iostream>#include <map>#include <cstdio>#include <string>using namespace std;int a[501];//题意是能不能把一组两个人分到两个不同的正营里面,关键利用map映射void init(){for(int i = 0; i <= 200; i++){a[i]

Address localhost:1099 is already in use:tomcat频繁重启端口占用问题

错误提示 Unable to open debugger port (127.0.0.1:58198): java.net.SocketException "Socket closed" Address localhost:1099 is already in use 端口被占用 报错原因 由于短时间内频繁运行tomcat服务器。 为了避免出现这一错误。可以点击刷新uodate

【ACDream】1074 风之国 线段树+DP

风之国 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 KB (Java/Others) Problem Description 在X轴上有这样一个国家——风之国。风之国虽然是一个国家,但是却有N个首领,每个首领管辖着各自的一个城市。曾几何时,风之国是非常和

【ACDream】 1093 女神的正多面体 矩阵快速幂

题目大意:给你三种正多边形,给你起点s,终点e以及最多行走的步数k,问有多少种路径方案(路径中只要有一个顶点不同即视为不同)。 题目分析: 可以通过矩阵快速幂求解。 为每个正多边形(最多三个)构建一个邻接矩阵A,然后第K步的方案数即为A^k。 结果即为A^1 + A^2 + A^3 + ...... + A^k. 对于这种形式的矩阵运算,我们可以把它拆分成: k为奇:ans = (

【ACdream】1157 Segments cdq分治

传送门:【ACdream】1157 Segments 题目分析:第一题cdq(陈丹琦)分治!cdq_____Orz! 听说cdq分治可以写,就去学了cdq分治了。。 在我们平常使用的分治中,每一个子问题只解决它本身(可以说是封闭的)。 而在cdq分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身。 具体算法流程如下: 1.将整个操作序列分为两个长

【ACdream】ACdream原创群赛(18)のAK's dream

这次的群赛AK的不少,7题的也很多啊。。Orrrrrrrz。。。。 暂时只写出7题。。。 A:1196 模拟。。 /** this code is made by poursoul* Problem: 1196* Verdict: Accepted* Submission Date: 2014-09-06 19:12:44* Time: 0MS* Memo

SDUT2876_走楼梯(大数)

走楼梯 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小虎发现走楼梯的时候一次上一个台阶比较惬意,一次上两个台阶比较高效,一次上三个台阶就很累人。 小虎是一个即注重质量又注重高效的人,于是他就在上楼梯的时候每步就只跨上一个台阶或两个台阶, 现在小虎想知道他这样上n阶的楼梯一共有多少种走法,但