P7593 「EZEC-8」凑数
P7593 「EZEC-8」凑数
记录一下在洛谷上的刷题
题目描述
给定 111 到 n 这 n 个正整数,请问能否恰好选择 k 个数,使选中的数之和为 s(每个数只能用 1 次)。
输入格式
本题有多组数据。
第一行一个正整数 T,表示数据组数。
对于每组数据,一行 3 个正整数 n,k,s。
输出格式
对于每组数据:
输出一行,一个字符串,Yes 或 No,表示是否可以恰好选择 k 个数,使选中的数之和为 s。
输入样例
3
5 2 10
5 2 5
5 2 2
输出样例
No
Yes
No
一道简单的入门题,找对思路可以说是很简单了,找不对的话,写出来肯定没问题,就是可能比较麻烦
需要找出k个数,那么在1 - n中由这k个数构成的和,最小值应该就是1 -> k这k个数构成的和,最大值应该就是n - k + 1 -> n这k个数构成的和
举一个例子1 -> 5之间取两个数,那么最小值就是1 + 2 = 3,最大值就是4 + 5 = 9,然后我们考虑最小值的情况下,让最后一个数加1,这样就是1 + 3 = 4,一直加下去,就是1 + 4 = 5, 1 + 5 = 6,不可以加了以后,我们让前一个数加,2 + 5 = 7,一直加下去,我们不难发现,我们可以取到3 -> 9之间的任意一个数,所以这道题也就迎刃而解了
需要注意的是,这道题数据比较大,ll一下就可以
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ll t, n, k, s;
cin >> t;
while(t--){
cin >> n >> k >> s;
if(s >= ((1 + k) * k / 2) && s <= (2 * n - k + 1) * k / 2) puts("Yes");
else puts("No");
}
return 0;
}

浙公网安备 33010602011771号