2009-04-29 19:12:20來源不明

一堆石頭

作法:利用2分搜尋+getchar 來解決陣列沒辦法開那麼大

/**************************************************/

#include<stdlib.h>     
#include<stdio.h>
int index1(int);
int L=0,a,b;
int ans[300001]={0},ansnumber[300001]={0};
main()
{
 int n=0,m=0,top,temp;
 while(1)
  {
   temp=getchar();
   if(temp==-1) break;
   if(temp<=57&&temp>=48) m=m*10+temp-48;
   else
    {
     n++;
     int index=index1(m);
     if(index!=-1) ansnumber[index]++;
     else
      {
       int now=-1;
       for(a=0;a<L&&now==-1;a++)
         if(ans[a]>m) now=a;
       if(now==-1)  now=L;
       for(a=L;a>now;a--)
        {ans[a]=ans[a-1];ansnumber[a]=ansnumber[a-1];} 
       ans[now]=m;
       ansnumber[now]=1;
       L++;            
      }
      m=0;
    }
  }
    for(a=0;a<L;a++) if(ansnumber[a]==2) {printf("%d\n",ans[a]);break;} 
 return 0;
}
int index1(int n)
{
 int lower=0, mid, high=L-1;
 int index=-1;
    do  
    {
      mid=(lower+high)/2;
      if(ans[mid]<n)
      lower=mid+1;
      else if(ans[mid]>n)
      high=mid-1;
      else
      index=mid;
    }
    while(index==-1&&lower<=high);
  return index;
}

上一篇:一堆線段

下一篇:Problem 47