弹性盒子布局

在弹性盒子布局(flexbox)中,存在两个关键概念:主轴(main axis)和交叉轴(cross axis)。

主轴是弹性盒子布局中的一个方向,它定义了弹性盒子的主要方向。在默认情况下,主轴是水平方向(左到右),但也可以通过设置flex-direction属性改变它的方向。

主轴排列方向是指在主轴上,弹性盒子中的项目(子元素)是如何排列的。在主轴排列方向上可以有不同的对齐方式,如以下几种常见的方式:

  • justify-content: flex-start;:项目向主轴起始位置对齐。
  • justify-content: flex-end;:项目向主轴结束位置对齐。
  • justify-content: center;:项目在主轴上居中对齐。
  • justify-content: space-between;:项目均匀分布在主轴上,首尾项目贴紧容器边缘。

题组: 

二分答案法加贪心

二分答案就是在答案范围内查找最优解

首先确定范围,这题的答案的最小值应该是分n段,即每个数一段

然后记录其中的最大值

最大值就是只分1段,即所有的数加起来

对于每次找到的mid,判断以mid为把n个数分成tot段后每段中的最大值

求tot(段数)

用贪心思想

从左至右遍历数列,只要sum+a[i]<= mid,就把a[i]加上

否则就sum=0,sum = a[i],tot++,新开一段

求得段数tot

如果tot<题目所给的段数,说明mid大了,所以r = mid

如果tot>题目所给的段数,l = mid+1

如果tot等于题目所给的段数,l = mid+1

最后的l就是答案



//E - 数列分段 Section II
//二分答案加贪心
#include 
using namespace std;
int a[100005],n,m;
int check(int ans)
{
	int sum = 0, tot = 0;
	for (int i = 1; i <= n; i++)
	{
		if (sum + a[i] <= ans)sum += a[i];
		else sum = a[i], tot++;
	}

	//tot表示目前二分到的答案ans所属于的段数
	if (tot < m)return 1;//找到可行解,m是题目给的段数,段数小于题目给的段数,说明ans太小
	else return 0;

}
int main()
{
	cin >> n>>m;
	int l=0, r=0;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		l = max(l, a[i]);
		r += a[i];
	}

	while (l < r)
	{
		int mid = (l + r) / 2;
		if (check(mid)) r = mid;
		else l = mid + 1;
	}

	cout << l << endl;
	return 0;

}

你可能感兴趣的:(前端)