题目:在机场买东西,有饮料和蛋糕,问最接近所有物品平均价格的饮料和蛋糕的价钱。
分析:简单题。直接平均值,比较即可,防止精度误差,都乘以物品总数。
注意:要用long long类型,防止数据溢出。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int m[1001];
int k[1001];
int n[1001];
long long abs( long long a, long long b )
{
if ( a > b ) return a-b;
else return b-a;
}
int main()
{
int T,N,M,K;
scanf("%d",&T);
for ( int t = 1 ; t <= T ; ++ t ) {
scanf("%d%d%d",&N,&M,&K);
long long avg = 0LL;
for ( int i = 0 ; i < M ; ++ i ) {
scanf("%d",&m[i]);
avg += m[i];
}
if ( K + M > N ) K = N - M;
for ( int i = 0 ; i < K ; ++ i ) {
scanf("%d",&k[i]);
avg += k[i];
}
N = N - K - M;
for ( int i = 0 ; i < N ; ++ i ) {
scanf("%d",&n[i]);
avg += n[i];
}
long long sum = M+K+N+0LL;
int min_c = 0;
for ( int i = 0 ; i < M ; ++ i )
if ( abs( sum*m[i]-avg ) < abs( sum*m[min_c]-avg ) )
min_c = i;
else if ( abs( sum*m[i]-avg ) == abs( sum*m[min_c]-avg ) && m[i] < m[min_c] )
min_c = i;
int min_j = 0;
for ( int i = 0 ; i < K ; ++ i )
if ( abs( sum*k[i]-avg ) < abs( sum*k[min_j]-avg ) )
min_j = i;
else if ( abs( sum*k[i]-avg ) == abs( sum*k[min_j]-avg ) && k[i] < k[min_j] )
min_j = i;
printf("Case #%d: %d %d\n",t,m[min_c],k[min_j]);
}
return 0;
}