专栏文章
题解:B4285 [蓝桥杯青少年组省赛 2022] 最大值
B4285题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miplaq2z
- 此快照首次捕获于
- 2025/12/03 13:51 3 个月前
- 此快照最后确认于
- 2025/12/03 13:51 3 个月前
题目大意
有许多彩纸,给出这些彩纸的长和宽,要求用这些彩纸减最少 个正方形,求满足条件的最大正方形边长。
思路
从大到小枚举正方形边长,每次枚举计算该边长最多能剪出多少个正方形,即枚举每张彩纸,累加每张彩纸能剪出的正方形数 ,即长能摆的正方形数乘宽能摆的正方形数,而如果直接用彩纸面积除以正方形面积是错误的,因为剪下正方形后可能会有剩余且不能摆出正方形的部分。若能剪出的正方形总数 ,就输出这个边长。
具体细节看代码吧!
具体细节看代码吧!
代码
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,s,x[505],y[505];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i){
cin>>x[i]>>y[i];
s+=x[i]*y[i];
}
cin>>k;
s/=k;
s=sqrt(s);
//s为正方形边长上限
//因为按照面积除肯定比按照边长除多(前面有讲),所以比是s大的正方形边长一定不可能满足要求
//所以从s开始枚举
for(int i=s;i>=1;--i){
int ans=0;
for(int j=1;j<=n;++j)ans+=(x[j]/i)*(y[j]/i);
//累加个数
if(ans>=k){
cout<<i<<"\n";
//满足要求就输出
return 0;
}
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...