题目链接:HDU 4982 Goffi and Squary Partition
题意:给出n和k,和为一个平方数的k-1个各不相同的数,在加上一个数(这个数也和k-1个数不同),他们总和等于n,求是否存在这样的序列。
思路:枚举平方数。构造最小的序列当然从1开始。
AC代码:
#include<stdio.h>
int k,n;
bool judge(int sum,int lef)//sum前k-1项和,lef剩下。sum+lef=n
{
if(lef==0 || 2*sum<(k-1)*k)
return false;
if(sum==1 && lef==1)
return false;
int x,ss;//ss为前k-2项和
ss=0,x=0;
for(int i=0;i<k-2;i++)//构造最小
{
x++;
if(x==lef)
x++;
ss+=x;
}
int temp=n-ss-lef;//第k-1项
if(temp<=x)//出现过
return false;
//temp>x
x++;//改变k-2项的值
//前k-2都是紧密排列的,如果(k-1),(k-2),lef相等,至少要移动2个位置才能满足要求。
if(temp==x && temp==lef)//k-2项+1等于k-1项等于lef
return false;
if(temp==x+1 && temp==lef)//k-2项+2等于k-1项等于lef
return false;
return true;
}
int main()
{
int i;
int lef;
while(scanf("%d %d",&n,&k)!=EOF)
{
int flag=0;
for(i=1;i*i<=n;i++)
{
lef=n-i*i;
if(judge(i*i,lef))
break;
}
if(i*i<=n)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}