配對(簡單貪心 C++)

配對
時間限制 1000ms 內存限制 65536KB
題目描述
給出2個序列A={a[1],a[2],…,a[n]},B={b[1],b[2],…,b[n]},從A、B中各選出n個元素進行一一配對(可以不按照原來在序列中的順序),並使得所有配對元素差的絕對值之和最大。
輸入格式
輸入的第1行爲1個整數n
第2行包含n個整數,題目中的A序列。
第3行包含n個整數,題目中的B序列。
輸出格式
一個數,最大配對
提示
3與6配對,2與7配對,5與4配對,6與1配對,絕對值之差和爲14
對於10%的數據,有n≤20;
對於30%的數據,有n≤100;
對於50%的數據,有n≤1000;
對於100%的數據,有n≤10000;a[i],b[i]≤1000。
樣例數據
輸入樣例
4
2 5 6 3
1 4 6 7
輸出樣例
14

思路點拔:一個簡單的貪心,我如果想讓它們差的絕對值的和最大,就要儘量讓小的和大的配對,才能使差值最大,所以輸入完兩個序列後,都從小到大進行排序,然後a序列的第一號位與b序列的最後一號位配(最小的和最大的配),接着a序列的第二號位與b序列的倒數第二位配(第二小的和第二大的配)…..我覺得這樣說,代碼已經很明確了,上代碼!!

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int a[10005],b[10005],sum; //sum用來記錄和
int main()
{
    int n;
    scanf("%d",&n); //輸入序列的長度
    for(int i=1;i<=n;i++) 
    {
        scanf("%d",&a[i]); //輸入a序列
    }
    sort(a+1,a+n+1); //排序
    for(int i=1;i<=n;i++)  //輸入b序列
    {
        scanf("%d",&b[i]);
    }
    sort(b+1,b+n+1); //也排個序
    for(int i=1,j=n;i<=n;i++,j--)
    //讓小的數與大的數配對,就保證和是最大的
    {
        sum+=fabs(a[i]-b[j]); //放心大膽的加和
    }
    printf("%d\n",sum);//輸出和,就是最終的結果
    return 0; //結束了~
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章