bc第六场Goffi and Squary Partition

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=52935

题意:要求你找k个不同的正整数满足以下条件:1、这k个数之和为n,2、k-1个数之和是某个正整数的平方

思路:我先用sqrt(n)找到满足条件的最大的正整数m,然后从m到1循环一遍,找是否存在满足条件的数,如果存在就break,输出yes,否则输出no

在寻找满足条件的数的时候,我的做法是找到前k-2个数,这个k-2个数要求最小,也就是从1开始,一直到k-2,如果其中包含那个正整数n-m*m,如果含有,那么就到k-1,这样前k-2个数就是最小的和,如果第k-1个数需要改变,那么只能变小,以维持正好等于m*m,然后第k-1个数就是n-(前k-2个数以及n-m*m的和)根据第k-1个数是否满足条件,第k-1应该满足:1、大于第k-2个数,2、如果这个数和n-m*m相等,那么这个数就得减小,同时第k-2个数中就需要增大,所以这个减小增大的范围内不能含有n-m*m

代码:

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
int n, k;

bool judge(int m)
{
    int sh = n - m*m;
    if (sh == 0) return false;
    int sum = 0;
    int cnt = 0;
    for (int i = 1; i <=k-2; i++)
    {
        cnt++;
        if (cnt == sh) cnt++;
        sum += cnt;
    }
    if (sum >= m*m) return false;
    int sh1 = m*m - sum ;
    if (sh1 <= cnt) return false;
    if (sh == cnt+1 || sh == cnt + 2)
    {
        if (sh1 == sh) return false;
    }
    return true;
}

int main()
{
    while (scanf("%d%d", &n, &k)!=EOF)
    {
        int m=sqrt(n);
        while(m)
        {
            if(judge(m))
                {
                    printf("YES\n");
                    break;
                }
            else
                m--;
        }
        if(m==0)
        printf("NO\n");
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章