计算机学院大学生程序设计竞赛(2015’12)The collector’s puzzle

Problem Description

There is a collector who own many valuable jewels. He has a problem about how to store them. There are M special boxes. Each box has a value. And each of the N jewels has a value too. 
The collector wants to store every jewel in one of the boxs while minimizing the sum of difference value. 
The difference value between a jewel and a box is: |a[i] - b[j]|, a[i] indicates the value of i-th jewel, b[j] indicates the value of j-th box.
Note that a box can store more than one jewel.
Now the collector turns to you for helping him to compute the minimal sum of differences.

Input

There are multiple test cases.
For each case, the first line has two integers N, M (1<=N, M<=100000).
The second line has N integers, indicating the N jewels’ values.
The third line have M integers, indicating the M boxes’ values.
Each value is no more than 10000.

Output

Print one integer, indicating the minimal sum of differences.

Sample Input

4 4

1 2 3 4

4 3 2 1

4 4

1 2 3 4

1 1 1 1

Sample Output

0

6

我们先排序,然后以第二个数组为基础,第一组的数据去查他们在第二组的位置

lower_bound一共两种情况,要么刚刚好找到,一个在左边比如2 3 4 5 7 查找3 返回2查找 6 返回5 我们不知道它离左边还是右边差值小,可以都考虑进去查找8 返回最后一个位置

#include<stdio.h>
//#include<bits/stdc++.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<sstream>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include<algorithm>
#include<limits.h>
#define MAXN (100000+10)
#define MAXM (100000)
#define inf 0x3fffffff
#define INF 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define ULL unsigned long long
using namespace std;
int a[MAXN],b[MAXN];
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        int sum=0;
        int i,j;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(i=1;i<=m;i++)
        {
            cin>>b[i];
        }
        sort(a+1,a+n+1);
        sort(b+1,b+m+1);
        for(i=1;i<=n;i++)
        {
            int mid=inf;
            int ans=lower_bound(b+1,b+m+1,a[i])-b;
         //   cout<<ans<<endl;
            if(ans<=m)
            {
                mid=min(mid,abs(a[i]-b[ans]));
            }
            if(ans>1)
            {
                mid=min(mid,abs(a[i]-b[ans-1]));
            }
            sum+=mid;
        }
        cout<<sum<<endl;
    }
    return 0;
}
时间: 2024-10-26 15:30:37

计算机学院大学生程序设计竞赛(2015’12)The collector’s puzzle的相关文章

hdu 计算机学院大学生程序设计竞赛(2015’11)

搬砖 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 5134    Accepted Submission(s): 1288 Problem Description 小明现在是人见人爱,花见花开的高富帅,整天沉浸在美女环绕的笙歌妙舞当中.但是人们有所不知,春风得意的小明也曾有着一段艰苦的奋斗史. 那时的小明还没剪去长发,没有信用卡没有她

HDU计算机学院大学生程序设计竞赛(2015’12)Happy Value

Happy Value Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1453    Accepted Submission(s): 428 Problem Description In an apartment, there are N residents. The Internet Service Provider (ISP) wa

HDU计算机学院大学生程序设计竞赛(2015’12)The Country List

The Country List Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2598    Accepted Submission(s): 615 Problem Description As the 2010 World Expo hosted by Shanghai is coming, CC is very honorable

计算机学院大学生程序设计竞赛(2015’12) 1003 The collector’s puzzle

#include<cstdio> #include<algorithm> using namespace std; using namespace std; const int maxn=100000+10; int a[maxn],b[maxn]; int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF) { for(int i=1; i<=n; i++) scanf("%d&

计算机学院大学生程序设计竞赛(2015’12) 1002 Polygon

#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; struct Point { double x; double y; } p[1001], px[10001]; int n; double eps=1e-8; int cmp(Point a, Point b) { if(ab

计算机学院大学生程序设计竞赛(2015’12) 1001 The Country List

#include<cstdio> #include<cstring> #include<cmath> #include<string> #include<vector> #include<map> #include<algorithm> using namespace std; char s[100+10][20+10]; int n; map<string ,int>m; int main() { while

计算机学院大学生程序设计竞赛(2015’12) 1005 Bitwise Equations

#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=120; long long X,K; long long basex[maxn]; long long basek[maxn]; int totx,totk; int main() { int T; scanf("%d",&a

计算机学院大学生程序设计竞赛(2015’12) 1008 Study Words

#include<cstdio> #include<cstring> #include<map> #include<string> #include<algorithm> using namespace std; int T; char s[100+10]; char r[100+10]; map<string,int>m; struct dan { char s[100+10]; int num; }d[1000000+10]; i

计算机学院大学生程序设计竞赛(2015’12) 1009 The Magic Tower

#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int whp,wat,wdef,bhp,bat,bdef; char s; int main() { while(~scanf("%c",&s)) { scanf("%d%d%d",&whp,&wat,&