CSUOJ 1165 枚举

题目

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



你可能感兴趣的:(c)