您的位置:首页 > 其它

蓝桥杯 历届试题 分巧克力

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: