在弹性盒子布局(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 <bits/stdc++.h>
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;
}