心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
题目大意:给出n个数字,给出一个数字x,求出n个数字中哪两个数字的和与x最接近。
我的做法是这样的,把n个数字两两求和的结果存在数组里面,排序,去重(这一步无所谓)。每当给出一个x的时候,二分查找大于等于x的第一个数字,和小于x的最后一个数字。比较即可得出结果。
以下是我的代码:
#include<vector>
#include
<algorithm>
#include
<cstdio>
#include
<cstdlib>
using namespace std;

int main()
{
    #ifndef ONLINE_JUDGE
    freopen(
"data.in","r",stdin);
    freopen(
"data.out","w",stdout);
    
#endif

    
int case_num(0),n;
    
while(scanf("%d",&n)==1 && n)
    {
        vector
<int> a,r;
        
for(int i=0;i<n;i++)
        {
            
int t;
            scanf(
"%d",&t);
            a.push_back(t);
            
for(int j=0;j<i;j++)
                r.push_back(a[j]
+t);
        }

        sort(r.begin(),r.end());
        r.erase(unique(r.begin(),r.end()),r.end());

        
/*
        for(int i=0;i<r.size();i++)
        {
            if(i!=0)
                printf(" ");
            printf("%d",r[i]);
        }
        printf("\n");
        //
*/
        case_num
++;
        printf(
"Case %d:\n",case_num);

        
int m;
        scanf(
"%d",&m);
        
for(int i=1;i<=m;i++)
        {
            
int x;
            scanf(
"%d",&x);

            
int dist(0x7f7f7f7f),ans;
            vector
<int>::iterator lpos(lower_bound(r.begin(),r.end(),x));
            
if(lpos!=r.end())
            {
                
int t=*lpos;
                
if(dist>abs(t-x))
                {
                    dist
=abs(t-x);
                    ans
=t;
                }
            }
            
if(lpos!=r.begin())
            {
                
int t=*(lpos-1);
                
if(dist>abs(t-x))
                {
                    dist
=abs(t-x);
                    ans
=t;
                }
            }

            printf(
"Closest sum to %d is %d.\n",x,ans);
        }
    }
}
posted on 2011-05-19 19:34 lee1r 阅读(385) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:排序

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理