HDU4982 Goffi and Squary Partition

来源:互联网 发布:用户管理系统java 编辑:程序博客网 时间:2024/05/17 22:56

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 24 222 4
     

    Sample Output
    NOYESYES

    题意:将一个数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");elseputs("NO");}return 0;}



    阅读全文
    0 0
    原创粉丝点击