专栏文章

题解:B4285 [蓝桥杯青少年组省赛 2022] 最大值

B4285题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miplpwiy
此快照首次捕获于
2025/12/03 14:03
3 个月前
此快照最后确认于
2025/12/03 14:03
3 个月前
查看原文

题意

读完后可得知:有 nn 张大小为 w×hw \times h 的纸,将这些纸剪成边长为 lenlen 的正方形纸,至少 kk 张,且纸可以不用完,但裁剪出的正方形边长必须为整数。请你求出满足条件的最大 lenlen 的值。

分析

典型的二分答案。模拟正方形的边长,每张彩纸单独累加其可剪成的正方形数量,最后判断剪出的正方形个数是否 k\ge k
注意:求第 ii 张纸可以剪出多少个正方形时,要分别求出行和列除以 lenlen 的商,再相乘。

Code

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,w[505],h[505],k,l,r;
bool check(int mid){//判断边长为mid时是否可以剪出k个正方形。
	int sum=0;
	for(int i=1;i<=n;i++){
		sum+=(w[i]/mid)*(h[i]/mid);
		if(sum>=k)return 1;
	}
	return 0;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld %lld",&w[i],&h[i]);
		r=max(r,max(w[i],h[i]));//正方形边长的最大值
	}
	scanf("%lld",&k);
	while(l<=r){//二分答案
		int mid=(l+r)>>1;
		if(check(mid)){
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	printf("%lld",r);//输出正方形的最大边长
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...