北大oj1020——Anniversary Cake

Anniversary Cake

Time Limit: 1000MS Memory Limit: 10000K

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!

看到這種有關(guān)圖的題目就有點(diǎn)頭疼,仔細(xì)研究了一下,最終的方案是優(yōu)先填滿每一行攘须,填滿了之后在去下一行搜索呢蔫。
剪枝策略還是老生常談的幾個(gè):
1.如果總面積不同直接錯(cuò)誤,
2.相同長(zhǎng)度的不要重復(fù)搜索堪滨,
3.每次搜索沒(méi)填滿的行從當(dāng)前y軸高度開(kāi)始搜索懂盐。(讓我的時(shí)間從172ms->47ms)
4.不要每次都去eachCake中判斷是否都為0北启。(讓我的時(shí)間從47ms->16ms)

#include<iostream>
#include<algorithm>
using namespace std;

int cakeArray[41][41];
int eachCake[11];
int m, n;
int maxSize;
int totalCakeCnt;

void addCake(int x, int y, int cakeSize) {
    for (int _y = y; _y < y + cakeSize; _y++) {
        for (int _x = x; _x < x + cakeSize; _x++) {
            cakeArray[_y][_x] = 1;
        }
    }
}

void removeCake(int x, int y, int cakeSize) {
    for (int _y = y; _y < y + cakeSize; _y++) {
        for (int _x = x; _x < x + cakeSize; _x++) {
            cakeArray[_y][_x] = 0;
        }
    }
}

int dfs(int index, int x, int y) {
    eachCake[index] --;
    totalCakeCnt--;
    if (totalCakeCnt==0) {
        return 1;
    }

    addCake(x, y, index);


    int newX, newY, maxLast;
    for (int _y = y; _y <= m; _y++) {
        //尋找當(dāng)前行剩余最大長(zhǎng)度
        newY = _y;
        maxLast = 0;
        bool start = false;
        for (int _x = 1; _x <= m; _x++) {
            if (cakeArray[_y][_x] == 0) {
                if (!start) {
                    start = true;
                    newX = _x;
                }
                maxLast++;
            }
            else {
                if (start) {
                    break;
                }
            }
        }
        if (maxLast > 0) {
            break;
        }
    }
    for (int i = min(maxLast, m - newY + 1); i > 0; i--) {
        if (eachCake[i] > 0 && dfs(i, newX, newY)) {
            return 1;
        }
    }
    
    eachCake[index] ++;
    totalCakeCnt++;
    removeCake(x, y, index);
    return 0;
}

int main() {
    int t;
    cin >> t;
    for (int _t = 0; _t < t; _t++) {
        cin >> m >> n;
        int totalSize = 0;
        maxSize = 0;
        totalCakeCnt = n;
        memset(eachCake, 0, sizeof(eachCake));
        memset(cakeArray, 0, sizeof(cakeArray));
        for (int _n = 0; _n < n; _n++) {
            int each;
            cin >> each;
            eachCake[each] ++;
            totalSize += each * each;
            if (each > maxSize) {
                maxSize = each;
            }
        }

        if (totalSize != m*m) {
            cout << "HUTUTU!" << endl;
            continue;;
        }

        //從上面開(kāi)始填格子
        if (dfs(maxSize, 1, 1)) {
            cout << "KHOOOOB!" << endl;
        }
        else {
            cout << "HUTUTU!" << endl;
        }
    }

    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝌麸,隨后出現(xiàn)的幾起案子点寥,更是在濱河造成了極大的恐慌,老刑警劉巖来吩,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敢辩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弟疆,警方通過(guò)查閱死者的電腦和手機(jī)戚长,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怠苔,“玉大人同廉,你說(shuō)我怎么就攤上這事「趟荆” “怎么了迫肖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)攒驰。 經(jīng)常有香客問(wèn)我蟆湖,道長(zhǎng),這世上最難降的妖魔是什么玻粪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任隅津,我火速辦了婚禮,結(jié)果婚禮上奶段,老公的妹妹穿的比我還像新娘饥瓷。我一直安慰自己,他們只是感情好痹籍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布呢铆。 她就那樣靜靜地躺著,像睡著了一般蹲缠。 火紅的嫁衣襯著肌膚如雪棺克。 梳的紋絲不亂的頭發(fā)上悠垛,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音娜谊,去河邊找鬼确买。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纱皆,可吹牛的內(nèi)容都是我干的湾趾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼派草,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搀缠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起近迁,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艺普,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鉴竭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體歧譬,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年搏存,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瑰步。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祭埂,死狀恐怖面氓,靈堂內(nèi)的尸體忽然破棺而出兵钮,到底是詐尸還是另有隱情蛆橡,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布掘譬,位于F島的核電站泰演,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏葱轩。R本人自食惡果不足惜睦焕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靴拱。 院中可真熱鬧垃喊,春花似錦、人聲如沸袜炕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)偎窘。三九已至乌助,卻和暖如春溜在,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背他托。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工掖肋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赏参。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓志笼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親把篓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子籽腕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,345評(píng)論 0 10
  • 四六級(jí)剛結(jié)束就急著對(duì)答案?纸俭?皇耗? 話說(shuō)還記得自己在考場(chǎng)上寫(xiě)了啥嗎?揍很?郎楼? 其實(shí)你只要只知道這3個(gè)答案就行:黃山=Hua...
    知米閱讀的知米妞閱讀 2,791評(píng)論 0 0
  • 彩排完,天已黑
    劉凱書(shū)法閱讀 4,224評(píng)論 1 3
  • 表情是什么窒悔,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒呜袁。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了简珠,難過(guò)就哭了阶界。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,314評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)聋庵,但是人生放棄了冒險(xiǎn)膘融,也就放棄了無(wú)數(shù)的可能。 ...
    yichen大刀閱讀 6,057評(píng)論 0 4