首页 > 代码库 > Goffi and Squary Partition
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 个数,那么这个 S 肯定不行。现在考虑已经用上述方法拆分了,我们需要判断这个拆分是否可行。会产生问题的只有最后一个数,这个数可能和 N-S 一样,也可能出现在之前的序列。如果是出现在之前的序列,那么这个拆分也是不靠谱的。如果和 N-S 一样,那么分两种情况1. N-S 曾出现在之前的序列,那么显然这个拆分也是不靠谱的2. N-S 比倒数第二个数大,对于这种我们可以通过调整最后一个数和倒数第二个数的大小,来使得这个拆分成立,假设最后一个数为 a,倒数第二个为 b,只要 a-1,b+1 就好了。当然如果 a-1 = b+1 这个拆分也是不靠谱的这道题目就这样搞定了,其实没必要找所有的完全平方数,只要找小于 N 与 N 最接近的完全平方数就好了。
注:以上“题意”及“分析”来自杭电OJ。
AC代码:
1 #include<stdio.h> 2 #include<math.h> 3 int n,k; 4 int judge(int num) 5 { 6 int p,i,q,sum=0,ans=0; 7 p=num*num;//记录的是比n小的最小的平方数 8 q=n-p;//q记录的是除k-1个数后的那个数 9 if(q==0)10 return 0;11 for(i=0;i<k-2;i++)//用 1,2,3...K-2这些连续自然数来构造12 {13 ans++;14 if(ans==q)15 ans++;16 sum+=ans;17 }18 if(sum+q>n)19 return 0;20 int cha=n-q-sum;21 if(cha<=ans)22 return 0;23 ans++;24 if(q==ans||q==ans+1)25 {26 if(cha==q)27 return 0;28 }29 return 1;30 }31 int solve()32 {33 int m=sqrt(n*1.0);//m记录的是比n小的最小的平方数开平方的值34 for(int i=m;i>=1;i--)35 {36 if(judge(i))//从M开始枚举直到找到符合条件的37 return 1;38 }39 return 0;40 }41 int main()42 {43 while(scanf("%d%d",&n,&k)!=EOF)44 {45 if(solve())46 printf("YES\n");47 else48 printf("NO\n");49 }50 return 0;51 }
Goffi and Squary Partition
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。