HDU1020(小正方形铺大正方形)

Anniversary Cake

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 16579   Accepted: 5403

Description

Nahid Khaleh decides to invite the kids of the "Shahr-e Ghashang" to her wedding anniversary. She wants to prepare a square-shaped chocolate cake with known size. She asks each invited person to determine the size of the piece of cake that he/she wants (which should also be square-shaped). She knows that Mr. Kavoosi would not bear any wasting of the cake. She wants to know whether she can make a square cake with that size that serves everybody exactly with the requested size, and without any waste.

Input

The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by input data for each test case. Each test case consist of a single line containing an integer s, the side of the cake, followed by an integer n (1 ≤ n ≤ 16), the number of cake pieces, followed by n integers (in the range 1..10) specifying the side of each piece.

Output

There should be one output line per test case containing one of the words KHOOOOB! or HUTUTU! depending on whether the cake can be cut into pieces of specified size without any waste or not.

Sample Input

2
4 8 1 1 1 1 1 3 1 1
5 6 3 3 2 1 1 1

Sample Output

KHOOOOB!
HUTUTU!

题意:用小正方形去铺大正方形,问是否能恰好铺满。思路:见代码。
#include <iostream>
#include <string.h>
using namespace std;
const int MAXN=165;
int side,n;
int l[MAXN];
int col[MAXN];
bool dfs(int dep)
{
    if(dep==n)    return true;
    int mn=165;
    int mnc;
    for(int i=1;i<=side;i++)//从最左和最上面开始填
    {
        if(col[i]<mn)
        {
            mn=col[i];
            mnc=i;
        }
    }
    for(int size=10;size>=1;size--)//先填大的
    {
        if(!l[size])    continue;
        if(col[mnc]+size<=side&&mnc+size-1<=side)//检查行与列是否越界
        {
            int wide=0;
            for(int i=mnc;i<=mnc+size-1;i++)//检查两端所夹的宽度buf
            {
                if(col[i]==col[mnc])
                {
                    wide++;
                }
                else    break;
            }
            if(wide>=size)//buf可以放下当前的小正方形
            {
                l[size]--;
                for(int i=mnc;i<=mnc+size-1;i++)
                {
                    col[i]+=size;
                }
                if(dfs(dep+1))
                {
                    return true;
                }
                //回溯
                l[size]++;
                for(int i=mnc;i<=mnc+size-1;i++)
                {
                    col[i]-=size;
                }
            }
        }
    }
    return false;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        memset(col,0,sizeof(col));
        memset(l,0,sizeof(l));
        cin>>side>>n;
        int sum=0;
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            l[x]++;
            sum+=(x*x);
        }
        if(side*side!=sum)
        {
            cout<<"HUTUTU!"<<endl;
        }
        else
        {
            if(dfs(0))
            {
                cout<<"KHOOOOB!"<<endl;
            }
            else
            {
                cout<<"HUTUTU!"<<endl;
            }
        }
    }
    return 0;
}
时间: 2024-10-07 18:41:44

HDU1020(小正方形铺大正方形)的相关文章

九度OJ1020-最小正方形-判大小

题目1020:最小长方形 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7410 解决:3521 题目描述:     给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内.长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内. 输入: 测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标占一行,其中|x|和|y|小于 231:一对0 坐标标志着一个测试用例的结束.注意(0, 0)不作为任何一个测试用例里面的点.一个没有

图像算法之十二:非局部均值滤波及其Matlab实现

保边去噪算法之二: 首先谈一下什么是非局部均值滤波.在此之前,我们先来看一下均值滤波的原理. 均值滤波 均值滤波的计算非常简单,将图像像素点灰度记录在数组中,然后设置方框半径的值,然后将方框中的所有点的像素求和取平均,得到的结果就是均值滤波后对应像素点的灰度值. 优点: 计算很快而且简单 从算法可以看出,只是求了平均,并没有很复杂的计算 缺点: 得到的图像很模糊 当方框的半径越大,得到的图像中那些变化较大的地方(边缘)计算后变化就越小,即边缘不明显,即模糊 非局部均值滤波 非局部均值滤波的基本原

从零开始学ios开发(八):Autorotation and Autosizing

不好意思,这一篇间隔的时间有点长,最近实在是事情太多,耽搁了,好了,长话短说,下面继续学习ios. 这次学习的内容是Autorotation和Autosizing,Autorotation就是屏幕内容自动旋转,因为iphone有重力感应系统(陀螺仪???),屏幕的内容会随着用户手握iphone的方式(竖着握Portrait.横着握Landscape)而改变,这个相信大家都已经有所体会,Autosizing是指当iphone的屏幕旋转后,屏幕里面控件的大小和位置也会自动改变.好了,下面跟着例子继续

canvas画图——初级篇

         canvas画图之初级篇 小女子准备将canvas画图分为初级篇,中级篇和高级篇来介绍,读者们不要着急哦. 初级篇 一.首先什么是canvas呢? canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆 布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现. canvas 英 ['kænv?s]  美 ['kænv?s]   帆布 画布 二.让我们先来了解下canvas的基

【Codechef】A Triangle and Two Squares-Problem Code: SQRTRI

题意: 给出一个边长为a的正方形,其左下角坐标为(0,0),右上角坐标为(a,a). 此外,再给出一个边长为b的小正方形,以及它的左下角坐标(x,y),其右上角. 坐标为(x+b,y+b),并且保证小正方形一定在大正方形内(有可能会与大正方形的边重合,但不会超出大正方形). 问是否存在一个在顶点都在大正方形边上的三角形,满足三角形一条边在包含小正方形的一条边(小正方形的一条边在三角形的一条边上),并且三角形包含小正方形(小正方形在三角形内部,正方形的顶点或者边可以与三角形边重合). 若存在,输出

poj 1020 Anniversary Cake(切正方形蛋糕+搜索)

Anniversary Cake Nahid Khaleh decides to invite the kids of the "Shahr-e Ghashang" to her wedding anniversary. She wants to prepare a square-shaped chocolate cake with known size. She asks each invited person to determine the size of the piece o

lintcode 中等题:Maximal Square 最大子正方形

题目: Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area. 样例 For example, given the following matrix: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 Return 4. 解题: 给定一个二维01矩阵,从中找出最大的全

习题10-3 角度和正方形 UVa1643

1.题目描述:点击打开链接 2.解题思路:本题是一道数学题.通过试验可以发现,不管第一个正方形放在哪里,第二个正方形总可以恰好放入第一个正方形和最下面那条射线之间.而且第一个正方形放的越靠上,中间围出来的阴影部分就越大.因此当第一个正方形和第二个正方形的对角线重合时,阴影面积达到最大.此时不难通过几何关系列式计算出阴影部分的面积. 其实也可以换一种理解方式,首先统计出所有小正方形的边长之和为L,那么以L为边长的大正方形夹在角中的阴影面积是确定的,而这些小正方形又可以恰好沿着大正方形的对角线放置,

HDU2589 正方形划分【DFS】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2589 题目大意: 有一个边长为L的正方形有L*L个小正方形,将N个小石子放在N个小正方形中,给你N个小石子所放 位置,那么问题来了:能否将这个变成为L的正方形分割成N个正方形,使得每个正方形中都含有1个 小石子,并且这N个正方形正好构成整个正方形. 测试样例1说明: 边长为5的大正方形里有8个小石子,正好能将大正方形分解成8个小正方形,且每个正方形中有1个 小石子. 思路: 用DFS来做这道题.用