其实这题水题本来不打算写的,晚上看了下题解,发现和我那时TLE N久的代码是一样的。
后来才发现我把最小值ans初始化:
long long ans=(long long)1<<60;
int index=0;
这样的最小值不够大,导致后面的数乘起来比这个最小值还要大,导致了没有更新index 而index又是0,在我的3个if中溜过去了... 伤不起啊...
导致了死循环... 太坑爹了....
题目大意:
有三排数,在每排中取一个,分别做差的平方。求最小。这题制定策略枚举就好了。
#include<iostream>
#include<cstdio>
#include<algorithm>
template<class T> void inline checkmin( T &a,T b ){ if( a>b||a==-1 ) a=b; }
using namespace std;
typedef long long ll;
int a[1<<20],b[1<<20],c[1<<20];
inline ll getans( ll a,ll b,ll c ){
return (a-b)*(a-b)+(a-c)*(a-c)+(b-c)*(b-c);
}
inline ll min(ll x, ll y){
return x<y?x:y;
}
int main()
{
int na,nb,nc;
while( scanf("%d%d%d",&na,&nb,&nc)!=EOF )
{
for( int i=0;i<na;i++ )
scanf( "%d",&a[i] );
for( int i=0;i<nb;i++ )
scanf( "%d",&b[i] );
for( int i=0;i<nc;i++ )
scanf( "%d",&c[i] );
ll mind=((ll)1<<63)-1;
int s1=0,s2=0,s3=0;
ll aa,bb,cc;
while( s1<na&&s2<nb&&s3<nc )
{
checkmin( mind,getans(a[s1],b[s2],c[s3]) );
ll k=(1ll<<63)-1;int index=0;
aa=getans(a[s1+1],b[s2],c[s3]);
bb=getans(a[s1],b[s2+1],c[s3]);
cc=getans(a[s1],b[s2],c[s3+1]);
/*
if( aa<bb && aa<cc ) s1++;
else if( bb<cc ) s2++;
else s3++;
*/
if( k>aa ) index=1,k=aa;
if( k>bb ) index=2,k=bb;
if( k>cc ) index=3,k=cc;
if( index==1 ) s1++;
else if( index==2 ) s2++;
else s3++;
}
printf( "%lld\n",mind );
}
return 0;
}