P7593 「EZEC-8」凑数

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;
}
posted @ 2021-07-03 15:07  _Aking  阅读(171)  评论(0)    收藏  举报