boj problem 1331 思路:快排分块 按块查找 问题:全局数组时可以定义到500W的 main函数下的数组不行~ 另外c语言比c++快 TLE可以考虑C~~具体原因待解决

Arsenal与水杯之间的故事 Submit: 1169    Accepted:189 Time Limit: 1000MS  Memory Limit: 65535K

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就出错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值