#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
priority_queue<int, vector<int>, greater<int>> Q;
int tmp;
for(int i=0;i<n;i++){
scanf("%d", &tmp);
Q.push(tmp);
}
int k;
scanf("%d", &k);
tmp = Q.top();
Q.pop();
for(int i=2;i<=k;i++){
while(tmp==Q.top())
Q.pop();
tmp = Q.top();
Q.pop();
}
printf("%d\n", tmp);
}
}
#include<bits/stdc++.h>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int a[10000]={0},k=0;
for(int i=0;i<n;i++){
scanf("%d",&k);
a[k]++;
}
scanf("%d",&k);
int s=0;
for(int i=0;i<10000;i++){
if(a[i]>0) s++;
if(s==k){
s=i;
break;
}
}
printf("%d\n",s);
}
}//hash法,也可用堆
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main
{
public static Set<Integer> set;
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
set = new HashSet<>();
for(int i = 0; i < n; i++)
set.add(scan.nextInt());
Object[] converted = set.toArray();
Arrays.sort(converted);
System.out.println(converted[scan.nextInt() - 1]);
scan.close();
}
}
map的键会自动按序排列。
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n,i,k,tmp;
while(cin>>n)
{
map<int,int> mmap;
for(i=0;i<n;++i)
{
cin>>tmp;
mmap[tmp]=1;
}
cin>>k;
auto it=mmap.begin();
for(;it!=mmap.end()&&k!=1;++it,--k){}
cout << it->first << endl;
}
return 0;
}
运行时间:44ms
占用内存:10932k
思路、注释,在代码里了。
import java.util.Arrays;
import java.util.Scanner;
/**
* @author Allen_Hua
* @create_time 创建时间:May 11, 2018 9:24:25 PM 类说明
*/
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
int n = scan.nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = scan.nextInt();
}
int k = scan.nextInt();// 第k小的数
// 从小到大排了序
Arrays.sort(arr);
// 遇到一种新的元素就加一 默认arr[0]是一种元素 temp初始化值为1
int temp = 1;
for (int i = 1; i < arr.length; i++) {
// 如果该数和前面一个数一样 则continue
// 不会执行循环体内该句下面的代码
if (arr[i] == arr[i - 1]) {
continue;
} else {// 如果该数和前面一个数不一样 则遇到了新的数
temp++;
}
if (temp == k) {
System.out.println(arr[i]);
}
}
}
}
}
//复杂度o(nlogn),先排序,然后相等的不输入,不等的计数加一,直到第k个不等的
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
int *a=new int[n],k,pos=1;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
cin>>k;
if(k==1)
cout<<a[0];
else{
for(int i=1;i<n;i++){
if(a[i]!=a[i-1])
pos++;
if(pos==k){
cout<<a[i]<<endl;
break;
}
}
}
}
return 0;
} #include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void)
{
int n;
vector<int> a;
while(cin >> n)
{
for(int i = 0;i < n;i++)
{
int x;
cin >> x;
a.push_back(x);
}
int k;
cin >> k;
sort(a.begin(),a.end());
int count = 0;//用来记数第K小的数
int max = 0;
for(vector<int>::iterator it = a.begin();it != a.end();it++)
{
if(*it > max)
{
max = *it;
count++;
}
if(count == k)
break;
}
cout << max << endl;
}
return 0;
} #include<iostream>
//#include<map>//map插入与搜索均是对数时间
#include<queue>//priority_queue查找最大值常数时间,插入对数时间
using namespace std;
int main()
{
int n, k, x;
while (cin>>n)
{
priority_queue<int, vector<int>, greater<int>> PQ;
for (int i = 0; i < n; i++)
{
cin >> x;
PQ.push(x);
}
cin >> k;
x = PQ.top();
PQ.pop();
for (int i = 0; i < k - 1; i++)
{
if (PQ.size() > 0)//防止没有第K小的数
{
if (PQ.top() == x)
i--;
else
x = PQ.top();
PQ.pop();
}
else
break;
}
cout << x << endl;
}
return 0;
} #include<stdio.h>
int a[1000],n;
int min()
{
int min=a[0],i,j;
for(i=1;i<n;i++)//找到最小的值
if(a[i]<min)
min=a[i];
for(i=0;i<n;i++)//去重
if(a[i]==min)
{
for(j=i;j<n-1;j++)
a[j]=a[j+1];//循环前移
n--;
i--;
}
return min;
}
int main()
{
int m,i,key;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
while(m--)
key=min();
printf("%d",key);
} #include<stdio.h>
bool flag[1000]={0};
int main(){
int n,x,k,j;
int cnt=0;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&x);
flag[x]=true;
a[i]=x;
}
scanf("%d",&k);
for(j=0;j<1000;j++){
if(flag[j]==true){
cnt++;
if(cnt==k)
break;
}
}
printf("%d",j);
} import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
TreeSet<Integer> set = new TreeSet<>();
int n = scanner.nextInt();
for (int i = 0; i < n; i++) set.add(scanner.nextInt());
ArrayList<Integer> list = new ArrayList<>(set);
int k = scanner.nextInt();
System.out.println(list.get(k-1));
}
}
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt();
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
int min = scanner.nextInt();
Arrays.sort(nums);
for(int i = 1; i < nums.length; i++) {
if(nums[i] == nums[i - 1]) continue;
min--;
if(min == 1) {
System.out.println(nums[i]);
return;
}
}
}
}
} #include <stdio.h>
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[n],seq,min;
for(int i=0;i<n;i++)scanf("%d",&a[i]);
scanf("%d",&seq);
for(int i=0;i<seq;i++) //进行seq次最小查找;
{
min=a[0];
for(int j=1;j<n;j++)if(min>a[j])min=a[j]; //查找当前序列最小值
for(int j=0;j<n && i!=seq-1;j++) //去重,当前最小值用尾部的值替换
{ //最后一次查找不去重,因为没有意义
if(min==a[j])
{
while(a[n-1]==min && n-1>j)n--; //注意数组末尾的数可能等于当前最小值!
a[j]=a[n-1];
n--;
}
}
}
printf("%d\n",min);
}
} #include<stdio.h>
#include<algorithm>
using namespace std;
int buf[1001];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&buf[i]);
}
sort(buf,buf+n);
int k;
scanf("%d",&k);
int count=1;//注意这里
int x=buf[0];
for(int i=1;count<k&&i<n;i++)
{
if(x<buf[i])
{
count++;
x=buf[i];
}
}
printf("%d\n",x);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//hash T(n)=O(n)
int main()
{
int a[1000],n,i,x,count,y;
while(scanf("%d",&n)!=EOF){
memset(a,0,sizeof(a));
for(i=0;i<n;i++){
scanf("%d",&x);
a[x]=1;
}
scanf("%d",&y);
count=0;i=0;
while(count!=y){
if(a[i]!=0)
count++;
i++;
}
printf("%d\n",i-1);
}
} import java.util.*;
public class Main{
public static void main(String[] args){
int n;
int[] a=new int[1000];
ArrayList<Integer> list=new ArrayList<Integer>();
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
n=scanner.nextInt();
for(int i=0;i<n;i++){
a[i]=scanner.nextInt();
if(!map.containsKey(a[i])){
map.put(a[i],1);
list.add(a[i]);
}
}
Collections.sort(list);
int k;
k=scanner.nextInt();
System.out.println(list.get(k-1));
}
}
}