题目
其实这题水题本来不打算写的,晚上看了下题解,发现和我那时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; }