900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 和集

和集

时间:2020-10-09 01:54:26

相关推荐

和集

/**//*

:8080/online/?action=problem&type=show&id=10181

*/

#include<cstdio>

#include<cstdlib>

usingnamespacestd;

structs

{

inta;//前一个操作数的下标

intb;//后一个操作数的下标

intvalue;//存储操作后的值

};

intn;

ssub1[499501];

ssub2[499501];

intdata[1001];

intnum=0;

intcomp(constvoid*aa,constvoid*bb){

structs*a=(s*)aa;

structs*b=(s*)bb;

returna->value-b->value;

}

intFindSub2(intstart,intend,intvalue)

{

intleft=start;

intright=end-1;

intmid;

while(left<=right)

{

mid=(left+right)/2;

if(sub2[mid].value==value)

returnmid;

elseif(sub2[mid].value>value)

right=mid-1;

else

left=mid+1;

}

return-1;

}

voidReadInfo()

{

for(inti=0;i<n;i++)

{

scanf("%d",&data[i]);

}

}

//存储+,-的值

voidStoreValue()

{

inti,j;

num=0;

for(i=0;i<n;i++)

{

for(j=i+1;j<n;j++)

{

sub1[num].a=i;

sub1[num].b=j;

sub1[num].value=data[i]+data[j];

inttmpi,tmpj;

if(data[i]>data[j])

tmpi=i,tmpj=j;

else

tmpi=j,tmpj=i;

sub2[num].a=tmpi;

sub2[num].b=tmpj;

sub2[num].value=data[tmpi]-data[tmpj];

num++;

}

}

}

intFindD()

{

inti,j;

intmax=-0x7FFFFFFF;

qsort(sub1,num,sizeof(structs),comp);

qsort(sub2,num,sizeof(structs),comp);

intstart=0;

for(i=0;i<num;i++)

{

while(start<num&&sub2[start].value<sub1[i].value)

start++;

if(start>=num)

break;

intindex=FindSub2(start,num,sub1[i].value);

if(index==-1)

continue;

if(sub2[index].a==sub1[i].a||sub2[index].a==sub1[i].b

||sub2[index].b==sub1[i].a||sub2[index].b==sub1[i].b)

continue;

if(max<data[sub2[index].a])

max=data[sub2[index].a];

}

returnmax;

}

intmain()

{

inti,j;

while(scanf("%d",&n)!=EOF&&n)

{

ReadInfo();

StoreValue();

intd=FindD();

if(d==-0x7FFFFFFF)

printf("nosolution\n");

else

printf("%d\n",d);

}

return0;

} 我是这样做的,存储所有的和和差的情况(差只取正值), 然后遍历和,用二分去查找差中是否存在和。

刚开始使用的是lower_bound,目测大约有10秒以上,自己写了一个二分,一下快多了。听kaikai说,STL在debug和release相差的很多,汗。。。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。