24h購物| | PChome| 登入
2009-11-01 13:38:23| 人氣783| 回應0 | 上一篇 | 下一篇

ACM 11572 11572 - Unique Snowflakes

推薦 0 收藏 0 轉貼0 訂閱站台

作法 : 快排+二分搜尋++++++++++++

題目是找出最長不重複數字!

上同一篇的文章  是不會在UVA通過的

這一篇  終於通過了!!

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

#include<stdio.h>
#include<stdlib.h>
struct node
{
   int num;
   int L;
}node[1000001]={0};
int compare(const void *ele1, const void *ele2)  
{  
  struct node  *px,*py;  
 
  px=(struct node *)ele1;  
  py=(struct node *)ele2;  
  /* 由小排到大 */   
  if(px->num >= py->num) return 1;  
  else return 0;    
}
int Search(int n,int L)  
{  
 int lower=0, mid, high=L-1;  
 int index=-1;  
    do   /*二分搜尋*/ 
    {  
      mid=(lower+high)/2;  
      if(node[mid].num<n)     lower=mid+1;  
      else if(node[mid].num>n)  high=mid-1;  
      else  index=mid;  
    }  
    while(index==-1&&lower<=high);  
  return index;  

int input()  
{  
  char cha;  
  int x=0;  
  while(cha=getchar())  
     if(cha!=' '&&cha!='\n') break;  
  x=cha-48;  
  while(cha=getchar())   
    {  
     if(cha==' '||cha=='\n') break;  
      x=x*10+cha-48;  
    }  
    return x;  
}
int in[1000001];
int check(int NUM,int last,int now,int N)
{
   int find=Search(NUM,N),a,b,MAX=-1;
   for(a=find;a<N;a++)
      if(node[a].num!=NUM) break;
      else
         {
            if(node[a].L>MAX&&node[a].L<now)
               MAX=node[a].L;
         }
   for(a=find-1;a>=0;a--)
      if(node[a].num!=NUM) break;
      else
         {
            if(node[a].L>MAX&&node[a].L<now)
               MAX=node[a].L;
         }
   if(last>MAX)  return last;
   else return MAX;
}
main()
{
  int T;
  scanf("%d",&T);
       while(T--)
          {
            int N,a,b,MAX=1,last=-1;
            scanf("%d",&N);
            for(a=0;a<N;a++)
              {
                in[a]=input();
                node[a].num=in[a];
                node[a].L=a;
              }
            qsort(node,N,sizeof(struct node), compare);
           /* for(a=0;a<N;a++)
                printf("%d %d\n",node[a].num,node[a].L);*/
            for(a=0;a<N;a++)
                {
                  int test=check(in[a],last,a,N);
                /*  printf("%d\n",test);*/
                  if(a-test>MAX) MAX=a-test;
                  last=test;
                }
            printf("%d\n",MAX);
              /* printf("%d %d\n",node[a].num,node[a].L);*/
         }
 return 0;
}

台長: 來源不明
人氣(783) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 11491 11491 - Erasing and Winning
此分類上一篇:ACM 750 750 - 8 Queens Chess Problem

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文