菜菜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题意:给你一个集合,每俩个数相加得到一个和s,输入s1,问离s1最近的s是多少

二分,注意如果二分出相等,那一定是最近的数,要不然就比较最后mid和mid-1的数

 
#include <string>
#include<iostream>
#include<map>
#include<memory.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<vector>


namespace cc
{
	using std::cout;
	using std::endl;
	using std::cin;
	using std::map;
	using std::vector;
	using std::string;
	using std::sort;
	using std::priority_queue;
	using std::greater;
	using std::vector;
	using std::swap;

	constexpr int N = 1001;
	//constexpr int N = 30;

	//priority_queue<int,vector<int>, greater<int> >q;

	int a[N];
	int b[N*N];

	void solve()
	{

		int n;
		int t = 0;
		while (cin >> n && n)
		{
			t++;
			for (int i = 0;i < n;++i)
				cin >> a[i];
			int k = 0;
			for (int i = 0;i < n - 1;i++)
			{
				for (int j = i + 1;j < n;j++)
				{
					b[k++] = a[i] + a[j];
				}
			}
			sort(b, b + k);
			int c, q;
			cin >> c;
			cout << "Case " << t << ":" << endl;
			while (c)
			{
				cin >> q;
				int qq = INT32_MAX;
				int l = 0, r = k-1;
				int mid=0;
				int ok = 0;
				while (l <= r)
				{
					mid = (l + r) / 2;
					if (b[mid] < q)
						l = mid + 1;
					else if (b[mid] > q)
						r = r - 1;
					else
					{
						ok = 1;
						break;
					}
				}
				if(ok)
				cout << "Closest sum to " << q << " is " << q<<"." << endl;
				else
				{
					if(mid==0)
						cout << "Closest sum to " << q << " is " << b[mid] << "." << endl;
					else if(abs(b[mid-1]-q) < abs(b[mid]-q))
						cout << "Closest sum to " << q << " is " << b[mid-1] << "." << endl;
					else
						cout << "Closest sum to " << q << " is " << b[mid] << "." << endl;
				}
				--c;
			}
		}

	}

};


int main()
{

#ifndef ONLINE_JUDGE
	freopen("d://1.text", "r", stdin);
#endif // !ONLINE_JUDGE
	cc::solve();

	return 0;
}

  

posted on 2018-11-12 22:48  好吧,就是菜菜  阅读(104)  评论(0编辑  收藏  举报