Subtract Operation-Codeforces

投稿日: 更新日:

問題リンク-Subtract Operation

問題

nn個の整数列が与えられます。数列の中からxxを選び取り除きます。そして数列に残っている値すべてに対してxxだけ減算します。最後に要素が1つだけ残るのでその値をkkにできるか判定してください。

解法

数列a1,a2,a3a_1, a_2, a_3を考えてみます。

a1,a2,a3a1を選びます(a2a1),(a3a1)(a2a1)を選びます(a3a1(a2a1))=(a3a2)\begin{aligned} a_1, &a_2, a_3\\ &\downarrow a_1を選びます\\ (a_2 - a_1)&, (a_3 - a_1)\\ &\downarrow (a_2 - a_1)を選びます\\ (a_3 - a_1& - (a_2 - a_1)) = (a_3 - a_2) \end{aligned}

となり、次の減算で前回の減算を打ち消すことが分かります。したがって、2つの組ai,aj(ij)a_i, a_j (i \neq j)を選びその差がkkとなるかを判定すればよい問題となりました。

実装

#include <bits/stdc++.h>
using namespace std;

string solve(){
    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    for(int i = 0;i < n; ++i){
        cin >> a[i];
    }

    sort(a.begin(), a.end());

    for(int i = 0;i < n; ++i){
        if(binary_search(a.begin(), a.end(), a[i] - k)){
            return "YES";
        }
    }
    return "NO";
}

int main(){
    int t;
    cin >> t;
    while(t--){
        cout << solve() << endl;
    }
    return 0;
}

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人