ABC
D - Souvenirs

D - Souvenirs

解説

問題 (opens in a new tab)

BjB_j について、AiBjA_i \ge B_j なる最小の AiA_i を見つけるという問題。

lower_bound などを用いてもよいが、同じ ii は複数使えないという制約があるので、 AABB をソートして、i=1,2,,ni=1,2,\dots,n に対して、Ai>=BjA_i >= B_j であれば AiA_i を使い、jj11 増やすという貪欲法で解くことができる。

条件を満たすかどうかは、jjmm になったかどうかで判定できる。

提出コード

  • Go
func main() {
	var n, m int
	scanIntVariables(&n, &m)
	A := readInts()
	B := readInts()
	sort.Slice(A, func(i, j int) bool {
		return A[i] < A[j]
	})
	sort.Slice(B, func(i, j int) bool {
		return B[i] < B[j]
	})
 
	ans := 0
	j := 0
	for i := 0; i < n; i++ {
		if j >= m {
			break
		}
		if A[i] >= B[j] {
			j++
			ans += A[i]
			continue
		}
	}
	if j == m {
		writeLine(ans)
	} else {
		writeLine(-1)
	}
}
  • C++
int main() {
    ll n, m; cin >> n >> m;
    vector<ll> A(n), B(m);
    rep(i, 0, n) cin >> A[i];
    rep(i, 0, m) cin >> B[i];
 
    sort(A.begin(), A.end());
    sort(B.begin(), B.end());
 
    ll ans = 0, j = 0;
    rep(i,0,n) {
        if (j == m) break;
        if (A[i] >= B[j]) {
            ans += A[i];
            j++;
        }
    }
 
    cout << (j == m ? ans: -1) << endl;
}