题目翻译

有 $n$ 个数,每次选一个删掉,其他数都减去删掉的数,问最后一个数会不会等于 $k$。

题目分析

这题一看就是结论题。我们先把 $a$ 数组假设为删除数字顺序定下来的数组,看最后结果。

上述过程每步已经化简。

那么,很容易看出,最后答案是两个数的差。

这题便成为了:$n$ 个数里,是否有两个数字差为 $k$。

那么我想到是用 mapset 做。

map 没访问的位置便不存在,不担心 RE,set 自带 count 找出现次数。

AC 代码

set

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve()
{
    set<ll>s;
    s.clear();
    ll n,k;cin>>n>>k;
    bool f=0;
    for(int i=1;i<=n;i++)
    {
        ll x;
        cin>>x;
        s.insert(x);
        if(s.count(x-k)||s.count(x+k))//差值为k,可能x是较大数,也可能是较小数。
        {
            f=1;
        }
    }
    puts(f==1?"YES":"NO");
}
int main()
{
    int t;cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

map

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve()
{
    map<ll,bool>mp;
    mp.clear();
    ll n,k;cin>>n>>k;
    bool f=0;
    for(int i=1;i<=n;i++)
    {
        ll x;
        cin>>x;
        mp[x]=1;
        if(mp[x-k]||mp[x+k])
        {
            f=1;
        }
    }
    puts(f==1?"YES":"NO");
}
int main()
{
    int t;cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}
最后修改:2023 年 04 月 22 日
v我50吃疯狂星期四