• 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
    ");
    47         else
    48             printf("NO
    ");
    49     }
    50     return 0;
    51 }
     
  • 相关阅读:
    Windows下路由表分析
    VMware Workstation网络连接的三种模式
    VMware Workstation环境下的三种网络配置桥接,NAT和HOST-ONLY
    Binary Tree Right Side View
    Count Complete Tree Nodes
    Flatten Binary Tree to Linked List
    Valid Anagram
    SELINUX部分的权限规则问题鸟哥7.4&&7.5?????
    网络五层架构及各层使用的协议
    Linux的echo -n -e 两个参数的含义
  • 原文地址:https://www.cnblogs.com/PJQOOO/p/3935871.html
Copyright © 2020-2023  润新知