题解玫瑰与杜鹃
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; }
以上是关于题解玫瑰与杜鹃的主要内容,如果未能解决你的问题,请参考以下文章