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;
}

 

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