hdu 4982 Goffi and Squary Partition

Goffi and Squary Partition

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1442    Accepted Submission(s): 479

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 k?1 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 (2≤n≤200000,2≤k≤30).

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,要求把n分成k个数之和的形式,其中存在k-1个数之和为一个完全平方数,而且这k个数各不相同。
分析: 我们尝试枚举那个完全平方数 S,然后看能否将他拆分为 K-1 个数,并且不用到N-S 这一步可以用贪心+一次调整来搞定。为了保证 K-1 个数都不同,我们尝试尽量

用 1,2,3...这些连续自然数来构造,如果 N-S 出现在这些数中,那么将 N-S 移除,再新加一个数。最后一个数由S-sum(1~k-2)(包括调整过的)来得到。

  • 1.如果sum值大于S值,可以分成两种情况来看

1.1 前k-2个数中不存在N-S,那么原数列为1,2,3,....,k-2,其中的和大于等于S值,且最小的数为1,没有剩余的空间减少这k-2个数的和

1.2 前k-2个数中存在N-S,设x等于N-S那么原数列为1,2,....x-1,x+1,.....,k-1,其中多出来的空间为避免N-S,同样不存在剩余空间减少和

  • 2.如果倒数最后一个数在前面k-2个数中出现,由上面结论可知,必定存在冲突,且无法调整
  • 3.如果倒数最后一个数与N-S相等,那么可以使得倒数第一个数-1和倒数第二个数+1,这样的调整代价是最小的,如果这样的处理方式仍存在冲突,就为错

#include <cstdio>
using namespace std;
int pnt[35],top;
int n,k;
bool check(int x)
{
    int sum=0,top=0;
    int r=n-x,cc=0,cnt=1;
    pnt[top++]=0;
    for(int i=0; i<k-2; i++)
    {
        cc++;
        if(cc==r) cc++;
        pnt[top++]=cc;
        sum+=cc;
    }
    if(sum>=x) return false;
      pnt[top]=x-sum;
    if(pnt[top]<=pnt[top-1]) return false;
    if(pnt[top]==r)
    {
        if(pnt[top-1]+1>=pnt[top]-1) return false;
    }
    return true;
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        int flag=0;
        for(int i=1; i<=2000; i++)
        {
            if(i*i>=n) break;
            if(check(i*i))
            {
                printf("%d\n",i*i);
                printf("YES\n");
                flag=1;
                break;
            }
        }
        if(flag) continue;
        printf("NO\n");
    }
    return 0;
}

时间: 2024-10-23 20:42:25

hdu 4982 Goffi and Squary Partition的相关文章

HDU 4982 Goffi and Squary Partition(推理)

HDU 4982 Goffi and Squary Partition 思路:直接从完全平方数往下找,然后判断能否构造出该完全平方数,如果可以就是yes,如果都不行就是no,注意构造时候的判断,由于枚举一个完全平方数,剩下数字为kk,构造的时候要保证数字不重复 代码: #include <cstdio> #include <cstring> #include <cmath> int n, k; bool judge(int num) { int yu = num * n

HDU 4982 Goffi and Squary Partition(BestCoder Round #6 1002)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4982 解析: 题意: 给你N和K,问能否将N拆分成K个互不相同的正整数,并且其中K-1个数的和为完全平方数     实际上,一拿到题目,我先想了下这里会不会存在负数或者0,后来经过几次华丽丽的WA之后发现,这题确实不用考虑到非正数.但是还是想吐槽一下,这个题目的意思也有点儿太不明晰了...     再说回题目来,我们枚举所有的完全平方数i*i,然后看能否将他拆成k-1个数,并且用不到n-i*i.所以

[BestCoder Round #6] hdu 4982 Goffi and Squary Partition(构造)

Goffi and Squary Partition 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: the sum of k p

hdu 4982 Goffi and Squary Partition (枚举)

//给出n和k,求k个不同的正整数,使其中k-1个数能组成平方数,k个数的和为n.有解输出YES,无解输出NO. # include <stdio.h> # include <string.h> # include <algorithm> # include <math.h> using namespace std; int n,k; bool judge(int num) { int yy=num*num;//k-1个数相加 int kk=n-yy; if

HDOJ 4982 Goffi and Squary Partition

Goffi and Squary Partition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 374    Accepted Submission(s): 145 Problem Description Recently, Goffi is interested in squary partition of integers.

【HDOJ】4982 Goffi and Squary Partition

题意就是整数划分,选出和为n的K个整数,其中K-1个数的和为完全平方数S.选择整数时需要从1,2,3..连续选择,当选择整数与n-S相等时,需要跳过n-S,即选择n-S+1.如此选择K-2个数,从而可确定第K-1个数,若该数已经出现(小于或等于K-2),则划分失败:若第K-1个数不等于n-S,则肯定划分成功,否则K-1个数若等于n-S.即需要通过将第K-2个数+1,同时第K-1个数-1得到正确的划分,并且需要保证调整后第K-2个数仍小于第K-1个数,因此,两数之间的距离至少大于2. 1 #inc

hdu4982 Goffi and Squary Partition (DFS解法)

BestCoder Round #6 B http://acm.hdu.edu.cn/showproblem.php?pid=4982 Goffi and Squary Partition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 308    Accepted Submission(s): 106 Problem Descrip

Goffi and Squary Partition

题意: 给你N和K,问能否将N拆分成K个互不相同的正整数,并且其中K-1个数的和为完全平方数. PS:这道题目原来是要求输出一种可行方案的,所以下面题解是按照输出方案的思想搞的. 分析: 我们尝试枚举那个完全平方数S,然后看能否将他拆分为 K-1 个数,并且不用到N-S 这一步可以用贪心+一次调整来搞定.为了保证 K-1个数都不同,我们尝试尽量用 1,2,3...这些连续自然数来构造,如果 N-S 出现在这些数中,那么将 N-S 移除,再新加一个数.如果这样都不能拆分成 K-1 个数,那么这个

HDU 4981 Goffi and Median(水)

HDU 4981 Goffi and Median 思路:排序就可以得到中间数,然后总和和中间数*n比较一下即可 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int N = 1005; int n, a[N], sum; int main() { while (~scanf("%d&