CF1878C Vasilije in Cacak 题解
简化题意
有 \(t\) 组询问,每次询问是否能从 \(1 \sim n\) 中选择 \(k\) 个数使得它们的和为 \(x\)。
解法
考虑临界情况,从 \(1 \sim n\) 中选择最小的 \(k\) 个数时和为 \(\sum\limits_{i=1}^k i=\dfrac{(k+1)k}{2}\),从 \(1 \sim n\) 中选择最大的 \(k\) 个数时和为 \(\sum\limits_{i=n-k+1}^n i=\dfrac{(n-k+1+n)k}{2}\)。
- 当 \(x<\dfrac{(k+1)k}{2}\) 或 \(x>\dfrac{(n-k+1+n)k}{2}\) 时一定无解,证明显然。
- 当 \(\dfrac{(k+1)k}{2} \le x \le \dfrac{(n-k+1+n)k}{2}\) 时一定有解,因为可以将 \(x-\dfrac{(k+1)k}{2}\) 分给选出的 \(k\) 个数。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
int main()
{
ll t,i,n,k,x;
cin>>t;
for(i=1;i<=t;i++)
{
cin>>n>>k>>x;
if((k+1)*k/2>x||(n-k+1+n)*k/2<x)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/17739835.html,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。