Regionals 2014 >> Latin America >> 6828 - Help cupid

6828 - Help cupid

题目:

Regionals 2014 >> Latin America >> 6828 - Help cupid_第1张图片

题目大意:两个数一组求其差值,求差值总和最小。

题目思路:由于两个数字相同则差值为0最小,可以先预处理,把两两相同的数字删去。最后最多剩下24个数字,然后暴力求解。

题目链接:6828 - Help cupid

以下是代码:

#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
int a[30];
int b[100];
int main(){
    int n;
    while(scanf("%d",&n) != EOF)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for (int i = 0; i < n; i++)
        {
            int num;
            cin >> num;
            a[num + 11]++;
        }
        int k = 0;
        for (int i = 0; i < 24; i++)
        {
            a[i] = a[i] % 2;
            if (a[i] == 1) b[k++] = i - 11;
        }
        for (int i = k; i < 2 * k; i++)
        {
            b[i] = b[i - k];
        }
        int ans = 9999999;
        for (int i = 0; i < k; i++)
        {
            int temp = 0;
            for (int j = i; j < i + k - 1; j += 2)
            {
                temp += min(abs(b[j] - b[j + 1]),24 - abs(b[j] - b[j + 1]));
            }
            ans = min(ans,temp);
        }
        cout << ans << endl;
    }
    return 0;
}

你可能感兴趣的:(Regionals,6828)