CodeTON Round 1 B题 【Subtract Operation】【思维】

题目链接

跳转链接

题意

给你一个包含 n 个整数的列表。您可以执行以下操作:从列表中选择一个元素 x,从列表中删除 x,然后从所有剩余元素中减去 x 的值。求是否能使列表中唯一剩余的元素等于 k。

思路

设数组原来为(这里按照删除顺序排序,最先删除的排最后): a 1    a 2    . . .    a n a_1\;a_2\;...\;a_n a1a2...an

减去一个数后 : ( a 1 − a n )    ( a 2 − a n )    . . .    ( a n − 1 − a n ) (a_1 - a_n)\;(a_2 - a_n)\;...\;(a_{n-1} - a_n) (a1an)(a2an)...(an1an)

再减去一个数后 : ( a 1 − a n − 1 )    ( a 2 − a n − 1 )    . . .    ( a n − 2 − a n − 1 ) (a_1 - a_{n-1})\;(a_2 - a_{n-1})\;...\;(a_{n-2} - a_{n-1}) (a1an1)(a2an1)...(an2an1)

(省略 n 次左右的操作)

最后得到: ( a 1 − a 2 ) (a_1 - a_2) (a1a2)

发现能否取到 k 只需看是否存在 2 个数使他们之间的差值为 k 即可

代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<int, int> pii;
#define ioClose() ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define debug printf("\n====================\n");

const int N = 2e5 + 5;
const int mod = 998244353;

int a[N];
map<int, bool> mp;

int main() {
    int T = 1;
    cin >> T;
    while (T--) {
        mp.clear();
        int n, k;
        cin >> n >> k;
        for (int i = 1; i <= n; i++) cin >> a[i], mp[a[i]] = true;
        bool flag = false;
        for (int i = 1; i <= n; i++) {
            if (mp[a[i] - k] || mp[k + a[i]]) {
                flag = true;
                break;
            }
        }
        puts(flag ? "YES" : "NO");
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值