10487

就是个标准的二分题,查找到应该插入的位置两边哪个数和这个数的差的绝对值最小即可

//============================================================================
// Name        : 10487.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

int a[1000010], in[1010];
int l, r, mid, num, n, T, m, t;

int main() {
	T = 0;
	while(scanf("%d", &n)&&n)
	{
		T++;
		printf("Case %d:\n", T);
		for(int i = 1;i <= n;i++)
		{
			scanf("%d", &in[i]);
		}
		num = 1;
		for(int i = 1;i <= n;i++)
		{
			for(int j = i+1;j <= n;j++)
			{
				a[num] = in[i]+in[j];
				num++;
			}
		}
		num--;
		sort(a+1, a+num+1);
		a[0] = a[1]-1;
		a[num+1] = a[num]+1;
		//printf("1:%d\n", a[1]);
		scanf("%d", &m);
		while(m--)
		{
			scanf("%d", &t);
			printf("Closest sum to %d is ", t);
			l = 0;r = num+1;
			while(l+1 != r)
			{
				mid = (l+r)/2;
				if(a[mid] > t)
				{
					r = mid;
				}
				else
				{
					l = mid;
				}
			}
			if(l == 0) printf("%d.\n", a[r]);
			else if(l == num) printf("%d.\n", a[num]);
			else printf("%d.\n", abs(t-a[l]) < abs(a[r]-t)?a[l]:a[r]);
		}
	}
	return 0;
}

转载于:https://www.cnblogs.com/ACKOKO/articles/2049401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值