HDU4982 Goffi and Squary Partition

Goffi and Squary Partition

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Problem Description
Recently, Goffi is interested in squary partition of integers.

A set  X  of  k  distinct positive integers is called squary partition of  n  if and only if it satisfies the following conditions:
[ol]
  • the sum of  k  positive integers is equal to  n
  • one of the subsets of  X  containing  k1  numbers sums up to a square of integer.[/ol]
    For example, a set {1, 5, 6, 10} is a squary partition of 22 because 1 + 5 + 6 + 10 = 22 and 1 + 5 + 10 = 16 = 4 × 4.

    Goffi wants to know, for some integers  n  and  k , whether there exists a squary partition of  n  to  k  distinct positive integers.
 

Input
Input contains multiple test cases (less than 10000). For each test case, there's one line containing two integers  n  and  k  ( 2n200000,2k30 ).
 

Output
For each case, if there exists a squary partition of  n  to  k  distinct positive integers, output "YES" in a line. Otherwise, output "NO".
 

Sample Input
  
  
2 2 4 2 22 4
 

Sample Output
  
  
NO YES YES

题意:将一个数n分成k个不同的数字,其中存在k-1个数字的和为平方数。如果存在输出YES,不存在输出NO。

题解:从1开始遍历平方数即可,然后判断该平方数是否符合情况。

如何判断:sum为前k-1个数的和,square为要判断的平方数,need为第k个数。

如果sum > square,说明最小的k-1个数的组合都比这个平方数大,不满足;

如果need <= k - 1 && sum + k > n,即第k个数在前k-1个数中,那么这k个数的最小和大于n时,不满足;

如果need == k && square - sum == 1,即第k个数是k,并且前k-1个数的和比平方数小1,此时必然会用到k这个数,所以重复,不满足。

代码:

#include <stdio.h>
#include <string.h>


int a[1000], tol;
bool judge(int square, int n, int k){
	int sum = k * (k - 1) / 2;
	int need = n - square;
	if(sum > square)
		return false;
	if(need <= k - 1 && sum + k > n)
		return false;
	if(need == k && square - sum == 1)
		return false;
	return true;
}
bool solve(int n, int k){
	for(int i = 0; i < tol && a[i] < n; i++){
		if(judge(a[i], n, k))
			return true;
	}
	return false;
}
int main(){
	int n, k;
	tol = 0;
	for(int i = 1; i*i < 200005; i++)
		a[tol++] = i * i;
	while(~scanf("%d%d", &n, &k)){
		bool flag = solve(n, k);
		if(flag)
			puts("YES");
		else
			puts("NO");
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值