数据比较小,所以直接将所有和算出来,然后在遍历和的数组,找出最靠近的。
#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; }