题意:
给你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代码:
 #include<stdio.h>
#include<math.h>
int n,k;
int judge(int num)
{
int p,i,q,sum=,ans=;
p=num*num;//记录的是比n小的最小的平方数
q=n-p;//q记录的是除k-1个数后的那个数
if(q==)
return ;
for(i=;i<k-;i++)//用 1,2,3...K-2这些连续自然数来构造
{
ans++;
if(ans==q)
ans++;
sum+=ans;
}
if(sum+q>n)
return ;
int cha=n-q-sum;
if(cha<=ans)
return ;
ans++;
if(q==ans||q==ans+)
{
if(cha==q)
return ;
}
return ;
}
int solve()
{
int m=sqrt(n*1.0);//m记录的是比n小的最小的平方数开平方的值
for(int i=m;i>=;i--)
{
if(judge(i))//从M开始枚举直到找到符合条件的
return ;
}
return ;
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
if(solve())
printf("YES\n");
else
printf("NO\n");
}
return ;
}
 

Goffi and Squary Partition的更多相关文章

  1. hdu 4982 Goffi and Squary Partition

    Goffi and Squary Partition Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Subm ...

  2. hdu4982 Goffi and Squary Partition (DFS解法)

    BestCoder Round #6 B http://acm.hdu.edu.cn/showproblem.php?pid=4982 Goffi and Squary Partition Time ...

  3. HDU 4982 Goffi and Squary Partition(推理)

    HDU 4982 Goffi and Squary Partition 思路:直接从全然平方数往下找,然后推断是否能构造出该全然平方数,假设能够就是yes,假设都不行就是no.注意构造时候的推断,因为 ...

  4. 【HDOJ】4982 Goffi and Squary Partition

    题意就是整数划分,选出和为n的K个整数,其中K-1个数的和为完全平方数S.选择整数时需要从1,2,3..连续选择,当选择整数与n-S相等时,需要跳过n-S,即选择n-S+1.如此选择K-2个数,从而可 ...

  5. BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告

    题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=530 (格式有一点点问题,直接粘 ...

  6. hdu 4859(思路题)

    Goffi and Squary Partition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. Partition:增加分区

    在关系型 DB中,分区表经常使用DateKey(int 数据类型)作为Partition Column,每个月的数据填充到同一个Partition中,由于在Fore-End呈现的报表大多数是基于Mon ...

  8. Partition:Partiton Scheme是否指定Next Used?

    在SQL Server中,为Partition Scheme多次指定Next Used,不会出错,最后一次指定的FileGroup是Partition Scheme的Next Used,建议,在执行P ...

  9. Partition:分区切换(Switch)

    在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...

随机推荐

  1. XML(三)

     使用 XSLT 显示 XML -------------------------------------------------------------------------------- 通 ...

  2. ViewPager控件的Demo

    1.主视图 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...

  3. php 写内容入csv文件乱码解决方法

    加入BOM头即可 fwrite($fp,"\xEF\xBB\xBF"); 参考:http://justcoding.iteye.com/blog/1668308

  4. 数据类型及其空间大小,vs2012实测

    #include "stdafx.h" #include <stdio.h> #include "common.h" #include " ...

  5. BZOJ 4177: Mike的农场( 最小割 )

    显然是最小割... 对于规律(i, j, k) i,j 互相连边, 容量为k 对于规则(S, a, b) 新建一个点x, x与S中每个点连一条弧, 容量+∞, 然后再根据a决定x与源点或汇点连边. 跑 ...

  6. Ext.net中常用的三种交互方式

    http://www.ext.net.cn/forum.php?mod=viewthread&tid=10433

  7. J2EE应用服务器计数器

    常用的J2EE应用服务器包括Weblogic.WebSphere和Tomcat等,以下是以WebLogic为例给出的计数器. 类别 计数器名称 计数器描述 JVM Heap Size JVM堆大小,该 ...

  8. 重设mysql数据库root用户密码

     原文:http://blog.sina.com.cn/s/blog_a3695da601010mrs.html   1, 启用任务管理器,结束mysql进程   2,进入命令行,进入mysql的bi ...

  9. cocos2d-x on wp8架构简单介绍

    1,基于C++的开发架构 支持3大移动平台以及3大桌面平台. 分为图形,声音,物理3大模块,另外还有脚本的导出. 在wp8/win32上的图形是基于d3d的,而在其它平台是基于opengl/openg ...

  10. NVelocity 实例

    using System; using System.IO; using System.Collections; using System.Collections.Generic; using Sys ...