题目描述
又是一年秋招季,小明手握N个offer(就是企业的录用意向),薪资有高有低,待遇也各有不同,为了方便选择,他对每个offer进行了评分(评分越高越好),但是他不想找最高的也不想找最低的,而是想找一个排名等于他幸运数字的,希望你可以帮帮他。
输入
第一行一个整数N(1<=N<=1000000),表示offer数量。
第二行N个整数,代表offer评分(无序),评分保证大于1,小于1000000,可能存在重复的评分。
第三行一个整数,代表幸运数字L(1<=L<=N)
输出
一个数字,表示小明选择的那个的offer评分。
样例输入 Copy
4
90 28 233 115
2
样例输出 Copy
115
//如果代码错了的话也请指点(手动狗头)
#include<stdio.h>
int main()
{
int n,t,p,i,j,a[1000000]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&p);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
printf("%d",a[p-1]);
return 0;
}
快排
#include <stdio.h>
int a[1000000], n, temp;
int findk(int num[], int k, int s, int e) {
int l = s, h = e, t = num[l];
while(l < h) {
while(l < h && num[h] <= t) {
h--;
}
num[l] = num[h];
while(l < h && num[l] >= t) {
l++;
}
num[h] = num[l];
}
num[h] = t;
if(h == k - 1)
return t;
else if(h > k - 1)
return findk(num, k, s, h - 1);
else
return findk(num, k, h + 1, e);
}
int find(int num[], int k, int n) {
return findk(num, k, 0, n - 1);
}
int main() {
int i, p;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &p);
printf("%d", find(a,p,n));
return 0;
}
要求是1秒,忘说了