数据比较小,所以直接将所有和算出来,然后在遍历和的数组,找出最靠近的。
#include<stdio.h>
#include<algorithm>
using namespace std;
int f(int a,int b)
{
if(a>b) return a-b;
return b-a;
}
int main()
{
int n,m,i,j,a[1024],b[30],cas=0,ans,cnt,k,sum[1000010];
while(~scanf("%d",&n)&&n)
{
for(i=0; i<n; i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(i=0; i<m; i++) scanf("%d",&b[i]);
cnt=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
sum[cnt]=a[i]+a[j];
cnt++;
}
sort(sum,sum+cnt);
printf("Case %d:\n",++cas);
for(i=0;i<m;i++)
{
if(b[i]<=sum[0]) ans=sum[0];
else if(b[i]>=sum[cnt-1]) ans=sum[cnt-1];
else
{
for(j=0;j<cnt-1;j++) if(b[i]>sum[j]&&b[i]<=sum[j+1]) break;
if(f(b[i],sum[j])>f(b[i],sum[j+1])) ans=sum[j+1];
else ans=sum[j];
}
printf("Closest sum to %d is %d.\n",b[i],ans);
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/