题目背景
手工课上拿同学出N张长方形彩纸,且每张彩纸上都画着W * H的网格(网格铺满整张彩纸)。现在同学将N张彩纸裁剪出K张大小相同的正方形,并且要使裁剪出的正方形的边长最大(裁剪的正方形边长必须为整数)。
例如:N=2, 有2张彩纸,第一张彩纸W = 4, H = 3:第二张彩纸W = 5,H = 4; K = 6,裁剪的6个正方形边长最大是2。
当给出N张长方形彩纸W和H,及K的值,请计算出将N张彩纸裁剪出K张大小相同的正方形,正方形的边长最大是多少(裁剪的正方形边长必须为整数)。
输入格式
第一行输入两个正整数N,K(1<N<100,1<K<100), N表示彩纸数量,K表示需裁剪的正方形数量,两个正整数之间一个空格隔开. 第二行开始,输入N行,每行输入两个正整数Wi,Hi (1 < Wi < 1000,1 < Hi < 1000,且 Wi≠Hi,,Wi表示彩纸的长度,Hi表示彩纸的宽度,两个正整数之间一个空格隔开.
**输出格式
**
输出一个正整数,表示将N张彩纸裁剪出K张大小相同的正方形的边长最大是多少(裁剪的正方形边长必须为整数),如果不能裁剪出K张正方形就输出“-1”
输入输出样例
输入样例
2 6
4 3
5 4
输出样例
2
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是一个C++的程序,可以解决该问题:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 105;
int n, k;
int w[MAXN], h[MAXN];
bool check(int len) { // 判断能否裁剪出k个边长为len的正方形
int cnt = 0;
for (int i = 1; i <= n; i++) {
cnt += (w[i] / len) * (h[i] / len);
if (cnt >= k) {
return true;
}
}
return false;
}
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> w[i] >> h[i];
}
int ans = 0;
for (int len = 1; len <= 1000; len++) { // 枚举边长
if (check(len)) {
ans = max(ans, len);
}
}
if (ans == 0) { // 无解
cout << -1 << endl;
} else {
cout << ans << endl;
}
return 0;
}
在上述代码中,我们首先读入输入数据,然后枚举正方形的边长len,对于每个边长,我们判断是否能够裁剪出k个边长为len的正方形。具体地,我们遍历每张彩纸,计算出该彩纸能够裁剪出多少个边长为len的正方形,然后累加起来,如果累计的正方形数量大于等于k,则认为能够裁剪出k个边长为len的正方形。最后输出最大的能够裁剪出的正方形的边长即可。
需要注意的是,如果无法裁剪出k个正方形,则输出-1。此外,由于题目中给出了1 < Wi < 1000,1 < Hi < 1000的限制,因此我们可以枚举边长len从1到1000。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢