我用了快排,跟二分搜尋去找尋最靠近的部份
但是在ZEROJUDGE可以通過.在UVA卻拿到WA
是輸入 輸出的格式嗎? 還是這裡的測資不好
#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=0;
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=0,last=0;
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);
if(a-test>MAX) MAX=a-test;
last=test;
}
printf("%d\n",MAX);
}
return 0;
}
以上為錯誤的程式碼
測資不夠嚴格
可以增加以下測資
input:
2
2
1 2
1
1
output:
2
1
這題我是用 STL 的 set 下去解
程式碼寫起來會簡潔的多