題目鏈接: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;
}