zoukankan      html  css  js  c++  java
  • 中山大学校队选拔赛第二章试题4【Division Of Board】------2015年2月8日

    一:题目大意

    首先给定一个长宽为x,y的木板,现在需要把该木板分为N块。每次分割时,需要平行于所切割木板的长和宽,且需要切断。最后切割完成时需要所切割出的每个木板面积相等。现在需要求出最后y/x中和最小的一种方案。

    二:题目分析

    本题主要考查搜索技术和动态规划知识的运用。考虑到问题的特殊性,因为每次需要平行于长和宽,那么我们可以如此想,我们可以分割出N块木板需要进行N-1步。所以对于每一个木板,我们可以从两方面出发:

    (1)把x边等分为n份,然后从1到n/2进行枚举。找到最小的一种方案。

    (2)把y边等分为n份,然后从1到n/2进行枚举。找到最小的一种方案。

    从这两种方案中选取最小的一种方案,并输出结果。

    三: AC代码

    #include<iostream>
    #include<cstdio>
    using namespace std;
    double  x,y,N;
    double cal(double x,double y,int n)
    {
        if(x>y)
        {
            double t;
            t=x;
            x=y;
            y=t;
        }//让y成为最大边
        if(n==1) return y/x;
         double  ans=n*n*y/x;//这里就是指x分为n等分的情况时求得的值
        for(int i=1;i<=n/2;i++)
        {
            double sump=cal(x*i/n,y,i)+cal(x*(n-i)/n,y,n-i);//将最小边x分为n份,然后递归枚举
            if(sump<ans) ans=sump;
        }
        for(int i=1;i<n/2;i++)
        {
            double sump=cal(x,y*i/n,i)+cal(x,y*(n-i)/n,n-i);//将最大边y分为n份,然后递归枚举
            if(sump<ans) ans=sump;
        }
        return ans;
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            cin>>x>>y>>N;
            double ans=cal(x,y,N);
            printf("%.6lf
    ",ans);g
        }
        return 0;
    }

    四:总结

    (1)本题利用到剪枝技巧的使用

    (2)学会根据已知限制条件枚举状态

    (3)掌握递归求解技巧(递归结束条件)

  • 相关阅读:
    P1631-序列合并
    P1484-种树
    17.树的子结构(python)
    16.合并两个排序的链表(python)
    反转链表
    链表中倒数第k个节点(python)
    调整数组顺序使奇数位于偶数前面(python)
    Spark--wordcount(词频降序)
    数值的整数次方
    二进制中1的个数(python)
  • 原文地址:https://www.cnblogs.com/khbcsu/p/4280439.html
Copyright © 2011-2022 走看看