uva 10487 Closest Sums

数据比较小,所以直接将所有和算出来,然后在遍历和的数组,找出最靠近的。

#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;
}


你可能感兴趣的:(uva 10487 Closest Sums)