每日刷题(二十六)
蓝桥杯第八届C语言B组省赛习题
习题I:分巧克力
这个题首先一看,数据还蛮大啊,100000,而且还有资源限定,一看直到很可能是一个动态规划的题。
题目对于输入的格式和上一个题有些类似,要输入的第一行分别是巧克力的数量和要分的小朋友数目,接下来的几行就分别是各块巧克力所对应的长和宽。这里我先写一个便于理解的C代码
#include<stdio.h>
int main()
{
int h[100000];
int w[100000];
int n, k;
scanf("%d%d",&n, &k);
int i;
for(i = 0; i < n; i++)
{
scanf("%d%d",&h[i],&w[i]);
}
int cnt = 0, j;
for(i = 100000; i >= 1; i--)
{
cnt = 0;
for(j = 0; j < n; j++)
{
cnt += (h[j] / i) * (w[j] / i);
}
if(cnt >= k)
{
printf("%d\n",i);
return 0;
}
}
return 0;
}
由于题目限制了资源大小,所以我们需要优化一下代码,用二分查找法,代码如下
#include<stdio.h>
int main()
{
int h[100000], w[100000];
int mid, l, r;
l = 1;
r = 100001;
int cnt = 0, len = 0, i;
int n, k;
scanf("%d %d",&n, &k);
for(i = 0; i < n; i++)
scanf("%d %d",&h[i], &w[i]);
while(l <= r)
{
cnt = 0;
mid = (l + r) / 2;
for(i = 0; i < n; i++)
{
cnt += (h[i] / mid) * (w[i] / mid);
}
if(cnt >= k)
{
l = mid + 1;
len = mid;
}
else
{
r = mid - 1;
}
}
printf("%d\n", len);
return 0;
}
运行结果如下