背景

明天就是期末数学考试了(太爽了,考完中午就能放假),看着《名校课堂》 P140P140 的不等式(组)的题目,突发奇想。


《名校课堂》 P140P140

这是一道题目:

某校八年级社会实践小组开展课外活动,调查某快餐店的营养情况.他们从食品安全监督部门获取了一份该快餐的信息(如图).若这份快餐中所含的蛋白质与碳水化合物的质量之和不高于这份快餐总量的 70%70\% ,则这份快餐最多含有多少克蛋白质?

1. 快餐成分:蛋白质、脂肪、碳水化合物和其他.
2. 快餐总质量为 400 克.
3. 碳水化合物质量是蛋白质质量的 4 倍.

以下是不等式的正解:

$$解:设蛋白质质量为 x 克,则碳水化合物质量为 4x 克。\\ x+4x≤400×70\% \\ x≤56 \\ 答:\_\_\_\_\_\_. $$

但是只要你学过二分搜索,不难发现,“最多含有多少克蛋白质”就是最小值最大。按题目意思二分即可。只需要把列好的不等式放到 check() 里面就好了。下面是二分答案黑科技:

#include <iostream>
using namespace std;
bool check(int x)
{
	return x + 4 * x <= 400 * 0.7;
}
int main()
{
	int l = 0, r = 1e2, ans = -1;
	while (l <= r)
	{
		int mid = l + (r - l) / 2;
		if (check(mid))l = mid + 1, ans = mid;
		else r = mid - 1;
	}
	cout << ans;
	return 0;
}

输出:

56

以此类推,下面是第二题(其实是第四题)。题目见《名校课堂》 P140P140

#include <iostream>
using namespace std;
bool check(int x)
{
	double jia = x * 160;
	if (x > 20)jia = 20 * 160 + (x - 20) * 160 * 0.9;
	double yi = x * 160;
	if (x > 25)yi = 25 * 160 + (x - 25) * 160 * 0.8;
	return yi > jia;
}
int main()
{
	int l = 0, r = 100;
	while (l <= r)
	{
		int mid = l + (r - l) / 2;
		if (check(mid))l = mid + 1;
		else r = mid - 1;
	}
	cout << l;
	return 0;
}

不等式组只需要两个二分,根据老师上课教的四种情况就好了。

不过劝你还是老实用不等式(组),这样你会老实一点。只因二分总是搞错……