【蓝桥杯】历届试题 分巧克力(C++)
2020-06-08 05:28
141 查看
【蓝桥杯】历届试题 分巧克力(C++)
问题描述
题目链接:分巧克力.
问题描述:
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。
为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
1. 形状是正方形,边长是整数
2. 大小相同
例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?
输入格式:
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000)
输入保证每位小朋友至少能获得一块1x1的巧克力。
输出格式:
输出切出的正方形巧克力最大可能的边长。
样例输入:
2 10
6 5
5 6
样例输出:
2
解题思路
- 用vector<pair<int,int> >vec来存储所有巧克力,并要求pair<int,int>短边在前,长边在后。并对vec中所有数据按first降序。
- 从目前能切出的正方形最大边长开始循环,遍历所有巧克力,计算在此正方形边长下,计算能切出的正方形巧克力数量,满足小朋友人数时结束循环。
- 输出当前边长,即为满足条件下的最大边长。
具体代码
#include<bits/stdc++.h> #include<vector> using namespace std; bool cmp(pair<int,int>a,pair<int,int>b){ return a.first > b.first; } int main(){ int n,k; vector<pair<int,int> >vec; cin>>n>>k; for(int i=0;i<n;i++){ int h,w; cin>>h>>w; if(h>w){ int temp=h; h=w; w=temp; } vec.push_back(pair<int,int>(h,w)); } sort(vec.begin(),vec.end(),cmp); int s=vec[0].first; while(s){ int sum=0; for(int i=0;i<n;i++){ int h=vec[i].first; int w=vec[i].second; if(s>h||s>w) break; sum+=(h/s)*(w/s); } if(sum>=k) break; s--; } cout<<s; return 0; }
相关文章推荐
- [算法练习]蓝桥杯历届试题 买不到的数目 暴力求解 C++
- 【蓝桥杯】历届试题 数字游戏(C++)
- 2017年第八届蓝桥杯试题(C/C++本科B组)9题 分巧克力
- [算法练习]蓝桥杯历届试题 Excel地址 进制转换 C++
- 历届蓝桥杯C/C++省赛试题
- 蓝桥杯 历届试题 高僧斗法(c++)
- [算法练习]蓝桥杯历届试题 油漆面积 C++
- 历届蓝桥杯C/C++省赛试题
- [算法练习]蓝桥杯历届试题 大臣的旅费 DFS C++
- 历届蓝桥杯C/C++省赛试题
- [算法练习]蓝桥杯历届试题 地宫取宝 超级详细的解题过程 C++
- 蓝桥杯 历届试题 国王的烦恼(c++)
- [算法练习]蓝桥杯历届试题 带分数 全排列 C++
- 蓝桥杯 历届试题 危险系数(c++)
- (蓝桥杯)历届试题PREV-4 剪格子 C++
- 蓝桥杯 历届试题 格子刷油漆(c++)
- 蓝桥杯 历届试题 PREV-37 分巧克力
- 历届蓝桥杯C/C++省赛试题
- 蓝桥杯 历届试题 分巧克力
- 【蓝桥杯】历届试题 矩阵翻硬币(C++)