蓝桥杯 古堡之门:数字之和挑战 题型:数学

68 阅读1分钟

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;
}

image.png