题目翻译
有 $n$ 个数,每次选一个删掉,其他数都减去删掉的数,问最后一个数会不会等于 $k$。
题目分析
这题一看就是结论题。我们先把 $a$ 数组假设为删除数字顺序定下来的数组,看最后结果。
上述过程每步已经化简。
那么,很容易看出,最后答案是两个数的差。
这题便成为了:$n$ 个数里,是否有两个数字差为 $k$。
那么我想到是用 map
和 set
做。
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;
}