蓝桥杯 历届试题 分巧克力
2018-03-06 14:57
253 查看
题目:
历届试题 分巧克力 时间限制:1.0s 内存限制:256.0MB 问题描述 儿童节那天有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数据规模和约定 峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。题解:最暴力的方法就是边长从最大的数(例如10010)逐渐减去1列举到0,然后求出在此边长下能切出多少块巧克力,判断是否是最大最合适的。这种方法会超时。
优化就是用二分求解,再加上一些个小细节的优化。代码如下://暴力解决
#include<iostream>
using namespace std;
struct cc{
int len,width;
}a[10010];
int main()
{
int n,m;
while(cin>>n>>m)
{
int maxs=0;
for(int i=0;i<n;i++)
{
cin>>a[i].len>>a[i].width;
}
int sum=0,sum1=0,i;
for(i=200;i>=0;i--)
{
sum1=sum;
sum=0;
for(int j=0;j<n;j++)
{
int x=a[j].len/i;
int y=a[j].width/i;
sum+=(x*y);
}
if(sum==m||(sum>m&&sum1<m))
break;
}
cout<<i<<endl;
}
return 0;
}
//二分解决
#include<stdio.h>
#define N 100005
int n,k;
int h
,w
;
bool ok(int max)
{
int i,ans=0;
for(i=0;i<n;i++)
{
int a=h[i]/max;
int b=w[i]/max;
ans+=a*b;
}
if(ans>=k)
return true;
return false;
}
int main()
{
scanf("%d%d",&n,&k);
int i,max=0;//max可以减少时间
for(i=0;i<n;i++)
{
scanf("%d%d",&h[i],&w[i]);
if(max<h[i])
max=h[i];
if(max<w[i])
max=w[i];
}
int l,r,mid;
l=0;
r=max+1;//结果可能是max不加1取不到最大的
while(r-1>l)
{
mid=(r+l)/2;
if(!ok(mid))
r=mid;
else
l=mid;
}
printf("%d\n",l);
return 0;
}
历届试题 分巧克力 时间限制:1.0s 内存限制:256.0MB 问题描述 儿童节那天有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数据规模和约定 峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。题解:最暴力的方法就是边长从最大的数(例如10010)逐渐减去1列举到0,然后求出在此边长下能切出多少块巧克力,判断是否是最大最合适的。这种方法会超时。
优化就是用二分求解,再加上一些个小细节的优化。代码如下://暴力解决
#include<iostream>
using namespace std;
struct cc{
int len,width;
}a[10010];
int main()
{
int n,m;
while(cin>>n>>m)
{
int maxs=0;
for(int i=0;i<n;i++)
{
cin>>a[i].len>>a[i].width;
}
int sum=0,sum1=0,i;
for(i=200;i>=0;i--)
{
sum1=sum;
sum=0;
for(int j=0;j<n;j++)
{
int x=a[j].len/i;
int y=a[j].width/i;
sum+=(x*y);
}
if(sum==m||(sum>m&&sum1<m))
break;
}
cout<<i<<endl;
}
return 0;
}
//二分解决
#include<stdio.h>
#define N 100005
int n,k;
int h
,w
;
bool ok(int max)
{
int i,ans=0;
for(i=0;i<n;i++)
{
int a=h[i]/max;
int b=w[i]/max;
ans+=a*b;
}
if(ans>=k)
return true;
return false;
}
int main()
{
scanf("%d%d",&n,&k);
int i,max=0;//max可以减少时间
for(i=0;i<n;i++)
{
scanf("%d%d",&h[i],&w[i]);
if(max<h[i])
max=h[i];
if(max<w[i])
max=w[i];
}
int l,r,mid;
l=0;
r=max+1;//结果可能是max不加1取不到最大的
while(r-1>l)
{
mid=(r+l)/2;
if(!ok(mid))
r=mid;
else
l=mid;
}
printf("%d\n",l);
return 0;
}
相关文章推荐
- 蓝桥杯 历届试题 分巧克力 (二分查找)
- 蓝桥杯 历届试题 错误票据
- 蓝桥杯历届试题之小朋友排队
- 蓝桥杯 历届试题 兰顿蚂蚁
- 蓝桥杯 历届试题 猜字母
- 蓝桥杯 历届试题 回文数字
- 蓝桥杯 - 连号区间数 (历届试题!)
- 蓝桥杯 历届试题 翻硬币
- 蓝桥杯——历届试题(1-10)
- 蓝桥杯历届试题 错误票据
- 蓝桥杯 历届试题 高僧斗法 (阶梯nim)
- 蓝桥杯 历届试题 核桃的数量
- 蓝桥杯试题集 历届试题 翻硬币
- 蓝桥杯 历届试题 错误票据 java详解
- 蓝桥杯_历届试题 地宫取宝
- 蓝桥杯历届试题之振兴中华
- 蓝桥杯历届试题 包子凑数
- 蓝桥杯 历届试题 世纪末的星期
- 蓝桥杯-历届试题-买不到的数目 数论 动态规划
- 蓝桥杯 历届试题 调和级数