题解玫瑰与杜鹃

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解玫瑰与杜鹃相关的知识,希望对你有一定的参考价值。

题解

   Teddy 很喜欢玫瑰花和杜鹃花。商店里有N个花瓶,第i个花瓶里面有roses[i]朵玫瑰花和lilies[i]朵杜鹃花。如果你买第i个花瓶,那么你就可以得到这个花瓶里面的所有玫瑰花和杜鹃花。每个花瓶最多只能买一次。现在Teddy决定买回一些花瓶,Teddy把得到的所有玫瑰花和杜鹃花围成一个长方形,使得长方形里面的玫瑰花和杜鹃花是间隔的,则如果当前格子是玫瑰花,那么它上下左右相邻的都是杜鹃花。同理,杜鹃花相邻的都是玫瑰花。还有个要求,Teddy必须把买到的玫瑰和杜鹃全部用完。
    由于Teddy比较喜欢方方正正的形状,因此希望长方形的长和宽的差的绝对值尽量小,你能把这个最小值找到吗?如果无法围成长方形,则输出-1。注意:正方形也是长方形的一种。

 

输入输出格式

输入格式

  多组测试数据。
    第一行:一个整数r, 表示共有r组测试数据,1<=r<=10。
    每组测试数据的格式是:
         第一行:一个整数n, 表示花瓶的数量。1<=n<=16。
         第二行:n个整数,第i个整数表示第i个花瓶的玫瑰花数量,范围是0至10000。
         第三行:n个整数,第i个整数表示第i个花瓶的杜鹃花数量。范围是0至10000。

 

输出格式

  共r行,每行一个整数,对应一组测试数据,表示长方形的长和宽的差的绝对值的最小值。或者-1.。

 

输入输出样例

输入样例

3
2
2   4
4   2
3
2  7  3
3  4  1
4
4  5  2  1
6  10  5  9

 

输出格式

1
0
-1

 

题解

  容易发现,当玫瑰花与杜鹃花数量相差小于等于1时,可以拼成一个矩形。

技术图片
#include <iostream>

#define MAX_N (16 + 5)

#define abs(x) ((x) >= 0 ? (x) : -(x))

using namespace std;

int G;
int n;
int a[MAX_N];
int b[MAX_N];
int ans;

void DFS(int x, int ta, int tb)
{
    if(abs(ta - tb) <= 1)
    {
        for(register int i = 1; i * i <= (ta + tb); ++i)
        {
            if((ta + tb) % i) continue;
            ans = min(ans, abs(i - (ta + tb) / i));
        }
    }
    for(register int i = x; i <= n; ++i)
    {
        DFS(i + 1, ta + a[i], tb + b[i]);
    }
    return;
}

int main()
{
    cin >> G;
    while(G--)
    {
        cin >> n;
        for(register int i = 1; i <= n; ++i)
        {
            cin >> a[i];
        }
        for(register int i = 1; i <= n; ++i)
        {
            cin >> b[i];
        }
        ans = 2147483647;
        for(register int i = 1; i <= n; ++i)
        {
            DFS(i + 1, a[i], b[i]);
        }
        if(ans == 2147483647) cout << "-1
";
        else cout << ans << "
";
    }
    return 0;
}
参考程序

 

以上是关于题解玫瑰与杜鹃的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1854 花店橱窗布置 分析+题解代码

题解:橱窗布置

杜鹃加速器的杜鹃加速器特点

杜鹃沙盒Cuckoo SandBox学习笔记

都铎王朝与玫瑰战争

[CSP-S模拟测试41]题解