Hai bạn học sinh trong lúc nhàn rỗi nghĩ ra trò chơi sau đây. Mỗi bạn chọn trước một dãy số gồm n số nguyên. Giả sử dãy số mà bạn thứ nhất chọn là:

b1, b2, …, bn

còn dãy số mà bạn thứ hai chọn là

c1, c2, …, cn

Mỗi lượt chơi mỗi bạn đưa ra một số hạng trong dãy số của mình. Nếu bạn thứ nhất đưa ra số hạng bi (1 ≤ i ≤ n), còn bạn thứ hai đưa ra số hạng cj (1 ≤ j ≤ n) thì giá của lượt chơi đó sẽ là |bi+cj|.

Ví dụ: Giả sử dãy số bạn thứ nhất chọn là 1, -2; còn dãy số mà bạn thứ hai chọn là 2, 3. Khi đó các khả năng có thể của một lượt chơi là (1, 2), (1, 3), (-2, 2), (-2, 3). Như vậy, giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể là 0 tương ứng với giá của lượt chơi (-2, 2).

Yêu cầu

Hãy xác định giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể.

Dữ liệu

  • Dòng đầu tiên chứa số nguyên dương n (n ≤ 105)
  • Dòng thứ hai chứa dãy số nguyên b1, b2, …, bn (|bi| ≤ 109, i=1, 2, …, n)
  • Dòng thứ hai chứa dãy số nguyên c1, c2, …, cn (|ci| ≤ 109, i=1, 2, …, n)

Hai số liên tiếp trên một dòng được ghi cách nhau bởi dấu cách.

Kết quả

Ghi ra giá nhỏ nhất tìm được.

Ràng buộc

  • 60% số tests ứng với 60% số điểm của bài có 1 ≤ n ≤ 1000.

Ví dụ

Dữ liệu:
2
1 -2
2 3

Kết qủa
0

Bài giải

#include <iostream>
#include <algorithm>

using namespace std;
typedef long long LL;

LL abs2(LL a)
{
	return a>0?a:-a;
}

int main()
{
	int n;
	LL *a,*b;
	cin>>n;
	a = new LL[n];
	b = new LL[n];
	
	for(int i=0; i<n; i++)
		cin>>a[i];
	for(int i=0; i<n; i++)
		cin>>b[i];
		
	
	sort(a+0,a+n);
	sort(b+0,b+n);
	
	LL min = abs(a[0] + b[0]);
	
	int dau = 0, cuoi = n-1;
	while(dau < n && cuoi >= 0)
	{
		if(abs2(a[dau] + b[cuoi]) < min)
			min = abs2(a[dau] + b[cuoi]);
		if((a[dau] + b[cuoi]) > 0)
			cuoi--;
		else dau++;
	}
	

	cout<<min<<endl;
	delete []a;
	delete []b;
	
	return 0;
}

 

Advertisements