Description
时间:某一天;
地点:915
ACM集训队刚刚做完个人赛,大家正在讨论长期重复使用塑料瓶的危害性,刚好这时候Arsenal4提着灌满了饮用水的塑料瓶进来,他听到我们的谈话后,慌了。通过一番谈话,集训队了解到,Arsenal4每天需要喝比较多的水,迫于无奈才使用这种容量足够大的塑料瓶。于是集训队的队员决定发扬雷锋精神,每个人送给了Arsenal4一个太空水杯!这下Arsenal4受宠若惊了,他决定在所有水杯中挑选一个水杯来使用,其他则捐给灾区人民。但挑选时遇到问题了,首先他不能选择容量太小的水杯,因为他如果没有喝够水,那么A题的效率就会大幅度降低;他也不能选择太大的水杯,因为可能会消化不良,最终Arsenal4决定挑选容量第K小的水杯,这下难倒他了,因为大家太积极了,以至于可选择的水杯太多了,所以他希望你能够帮他找到第K小的水杯。
Input
题目含有多组数据。
每组数据的第一行都有2个数,N和K,N(N<=5000000)表示大家送给Arsenal4的水杯的总数,以及K(K<=N),表示Arsenal4想找到的容量第K小的水杯。接下来的1行里有N个正整数,代表了每个水杯的容量。
Output
每一组数据输出仅为一行,且只有一个数,Arsenal4找到的容量第K小的水杯的容量。
Sample Input
10 5
5 8 1 4 4 8 3 2 7 10
Sample Output
4
#include<iostream>
using namespace std;
int a[5000001];
int quicksort(int low,int high)
{
int mid;
mid=(low+high)/2; //去中间数做为标志 如果取开头 如果数组有序 可能n^2复杂度~
int temp=a[mid];
a[mid]=a[low];
a[low]=temp;
while(low<high)
{
while(low<high && temp<a[high]) //如果改成while(low<high && temp<=[high])
high--; // high--
if(low<high) // if(low<high) a[low]=a[high]也会超时
a[low++]=a[high];
while(low<high && temp>a[low])
low++;
if(low<high)
a[high--]=a[low];
}
a[low]=temp;
return low;
}
void qsort(int low,int high,int k)
{
int index;
if(low<high)
{
index=quicksort(low,high);
if(k<index)
qsort(low,index-1,k);
else if(k==index)
return ;
else if(k>index)
qsort(index+1,high,k);
}
}
int main()
{
int t,n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(0,n-1,k-1);
cout<<a[k-1]<<endl;
}
}
/*int main() 用这个main就超时~
{
int i,n,k;
while(cin>>n>>k)
{
for(i=0;i<n;i++)
cin>>a[i];
qsort(0,n-1,k-1);
cout<<a[k-1]<<endl;
}
return 0;
}*/
学到的:1 快排等可以考虑随机选取标志 否则取第一个,数据有序可能变成冒泡
2 C语言可能要比C++快,TLE时可以考虑C试试
3 全局静态数组可以很大,但是main函数下的到30W就出错