蓝桥杯2017第八届C语言B组省赛习题题解——习题I.分巧克力**

每日刷题(二十六)

蓝桥杯第八届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;
}

运行结果如下
在这里插入图片描述

这道题目的讲解到这里也就结束了,如果有需要讲解二分查找的相关算法,可以在评论区扣1并给文章点赞,如果点赞超过10个我就会立刻在下一期讲有关二分查找的算法,当然我以后也会讲这个知识点,只是点赞的话写博客的动力会更大一些更新也会更快。如果喜欢我的文章,请记得三连哦,点赞关注收藏,感谢支持,下期更精彩!!!

发布了40 篇原创文章 · 获赞 7 · 访问量 3109

猜你喜欢

转载自blog.csdn.net/qq_44631615/article/details/104683736