2.古堡之门:数字之和挑战 - 蓝桥云课 (lanqiao.cn)
思想
n最大1e5,肯定不能用全排列,这里可以用数学思想来做。
首先判断一下x是否在前k个最小数和后n-k个最大数之间,如果在就是yes,否则就是No:
这个逻辑的原因在于数学性质。当我们选择从1到N中选择K个不同的数字时,最小的K个数字的和是1+2+3+...+K,可以用等差数列求和公式得到为K*(K+1)/2。同理,最大的K个数字的和是N+(N-1)+...+(N-K+1),也可以用等差数列求和公式得到为(2*N-K+1)*K/2。
因此,如果目标和X在这个范围内,就意味着存在从1到N中选择K个不同的数字使它们的和等于X。这种方法利用了数学的性质来判断是否存在解,避免了遍历所有可能的组合。
#include <iostream>
using namespace std;
#define int long long
int n,k,x;
int minn,maxn;
signed main()
{
cin>>n>>k>>x;
for(int i=1;i<=k;i++)
{
minn+=i;
}
for(int i=n;i>n-k;i--)
{
maxn+=i;
}
if(x>=minn&&x<=maxn)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}