Uva_10487
Sort all sums after calculation, and then perform binary search.
# Include <stdio. h>
# Include < String . H>
# Include <stdlib. h>
Int CMP ( Const Void * _ P, Const Void * _ Q)
{
Int * P = ( Int *) _ P;
Int * Q = ( Int *) _ Q;
Return * P-* q;
}
Int A [ 1010 ], S [ 1000010 ];
Int Main ()
{
Int I, j, k, n, m, n, T, Min, mid, Max;
T = 0 ;
While ( 1 )
{
Scanf ( " % D " , & N );
If (N = 0 )
Break ;
N =0 ;
For (I = 0 ; I <n; I ++)
{
Scanf ( " % D " , & A [I]);
For (J = 0 ; J <I; j ++)
S [n ++] = A [I] + A [J];
}
Qsort (S, N, Sizeof (S [ 0 ]), CMP );
Printf ( " Case % d: \ n " , ++ T );
Scanf ( " % D " , & M );
For (I = 0 ; I <m; I ++)
{
Scanf ( " % D " , & K );
Min =0 ;
Max = N;
While ( 1 )
{
Mid = (min + max )/ 2 ;
If (S [Mid] = K)
Break ;
If (Min = mid)
Break ;
If (S [Mid]> K)
Max = mid;
Else
Min = mid;
}
Printf ( " Closest sum to % d is " , K );
If (Mid! = Min)
Printf ( " % D " , S [Mid]);
Else If (Max = N)
Printf (" % D " , S [Mid]);
Else
Printf ( " % D " , ABS (s [Min]-k) <ABS (s [Max]-k )? S [Min]: s [Max]);
Printf ( " . \ N " );
}
}
Return 0 ;
}