CodeForces 457 B.Distributed Join(贪心)

来源:互联网 发布:淘宝V6会员网贷 编辑:程序博客网 时间:2024/06/03 19:10

Description

有两个表,A表有m个分区,第i个分区有ai行,B表有n个分区,第i个分区有bi行,每次操作可以任一个表的任一分区的一行复制到任意另一个分区里,最后需要满足,对于任意A表的一行和任意B表的一行,都存在一个分区包含这两行,问最少进行多少次操作

Input

第一行两个整数nm分别表示两个表的分区数,之后输入n个整数ai表示A表第i个分区的行数,之后输入m个整数bi表示B表第i个分区的行数(1n,m105,1ai,bi109)

Output

输出满足条件所需的最少操作数

Sample Input

2 2
2 6
3 100

Sample Output

11

Solution

最优方案对于一个分区里的行的处理是一样的,所以我们只需要考虑对任意11n,1jm,存在一个分区有A表第i个分区的ai行和B表第j个分区的bj行即可,固定i,有两种比较优的策略,要么把B表复制到A表第i个分区,要么把A表第i个分区复制到最大分区然后把B表复制到A表最大分区,对于A表的最大分区这两种方案的代价是一样的,对于A表的其他分区,假设是第i个分区,那么最小代价是min{j=1nbj,ai},这是把B表往A表复制的最优解,把A表往B表复制的最优解同理,显然不可能两边来回复制,所以最后从两种策略中选较优的即可

Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 111111int m,n,a[maxn],b[maxn];int main(){    while(~scanf("%d%d",&m,&n))    {        ll sum1=0,sum2=0;        for(int i=0;i<m;i++)scanf("%d",&a[i]),sum1+=a[i];        for(int i=0;i<n;i++)scanf("%d",&b[i]),sum2+=b[i];        sort(a,a+m),sort(b,b+n);        ll ans1=sum2,ans2=sum1;        for(int i=0;i<m-1;i++)ans1+=min(sum2,1ll*a[i]);        for(int i=0;i<n-1;i++)ans2+=min(sum1,1ll*b[i]);        printf("%I64d\n",min(ans1,ans2));    }    return 0;}
原创粉丝点击