AOJ 1153 Equal Total Scores

問題

Equal Total Scores | Aizu Online Judge

  • n枚のカードを持つ太郎とm枚のカードを持つ花子が1枚ずつカードを交換して合計点数が等しくなるようにする
  • 交換するカードの点数を出力(複数通りあるときは和が最小のもの)

方針

n, mが100以下なので全通りの交換を調べる

コード

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

#define rep(i, n) for(int i=0; i<(n); ++i)

int main(void){
    int n, m;
    int a[101], b[101];
    bool flag;
    while(cin >> n >> m && n) {
        rep(i, n) scanf("%d", &a[i]);
        rep(i, m) scanf("%d", &b[i]);
        int suma = 0, sumb = 0;
        rep(i, n) suma += a[i];
        rep(i, m) sumb += b[i];
        flag = false;
        int ans_a = INT_MAX/2, ans_b = INT_MAX/2;
        rep(i, n) {
            rep(j, m) {
                if(suma-sumb == 2*(a[i]-b[j])) {
                    if(ans_a+ans_b > a[i]+b[j]) {
                        ans_a = a[i];
                        ans_b = b[j];
                        flag = true;
                    }
                }
            }
        }
        if(flag) cout << ans_a << " " << ans_b << endl;
        else cout << -1 << endl;
    }
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1885053

反省

  • rep(j, m)rep(j, n)にしていてハマった(さすがに頭が悪い)
  • INT_MAXはstd::numeric_limits<int>::max()を使うのがC++流っぽい