首页 > 其他 > 详细

【CodeForces 620D】Professor GukiZ and Two Arrays

时间:2016-02-12 17:29:16      阅读:478      评论:0      收藏:0      [点我收藏+]

题意

两个数列,一个有n个数,另一个有m个数,让你最多交换两次两个数列的数,使得两个数列和的差的绝对值最小,求这个差的绝对值、最少交换次数、交换数对

分析

交换0次、1次可得到的最小的差可以枚举出来。

交换两次,如果枚举就超时了。

我们预处理把第一个数列两两组合的所有情况存储起来为u数组,并且按照大小排序,接着在另一个数列里枚举两个数后,用二分的方法,求交换后使得 差的绝对值最小 的u。

二分查找最接近的值可以用lower_bound函数。

代码

#include<stdio.h>
#include<cmath>
#include<map>
#include<utility>
#define N 2005
#define ll long long

using namespace std;
ll a[N],b[N],n,m,suma,sumb,v,ans,c;

map<ll,pair<int,int> >u;
map<ll,pair<int,int> >::iterator it;
pair<int,int>swap1,swap2;

void update(int i,int j)
{
    if(abs(c-it->first) < v)
    {
        ans=2;
        v = abs(c - it->first);
        swap1 = it->second;
        swap2 = {i,j};
    }
}

int main()
{
    scanf("%lld",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%lld",&a[i]);
        suma+=a[i];
    }

    scanf("%lld",&m);
    for(int i=1; i<=m; i++)
    {
        scanf("%lld",&b[i]);
        sumb+=b[i];
    }

    v=abs(suma-sumb);
    if(!v)
    {
        printf("0\n0\n");
        return 0;
    }

    for(int i=1; i<n; i++)
        for(int j=i+1; j<=n; j++)
            u[(a[i]+a[j])*2LL] = {i,j};

    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            if(abs(suma-sumb-2LL*(a[i]-b[j]))<v)
            {
                ans=1;
                v=abs(suma-sumb-2LL*(a[i]-b[j]));
                swap1= {i,j};
            }
    for(int i=1; i<m; i++)
        for(int j=i+1; j<=m; j++)
        {
            c=suma-sumb+2LL*(b[i]+b[j]);
            it=u.lower_bound(c);
            if( it != u.end() )
                update(i,j);
            if( it != u.begin() )
            {
                it--;
                update(i,j);
            }
        }

    printf("%lld\n%lld\n",v,ans);

    if(ans==1)printf("%d %d\n",swap1.first,swap1.second);
    if(ans==2)printf("%d %d\n%d %d\n",swap1.first,swap2.first,swap1.second,swap2.second);

    return 0;
}

【CodeForces 620D】Professor GukiZ and Two Arrays

原文:http://www.cnblogs.com/flipped/p/5187123.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!