给你 n 个项目,编号从 0 到 n - 1 。同时给你一个整数数组 milestones ,其中每个 milestones[i] 表示第 i 个项目中的阶段任务数量。
你可以按下面两个规则参与项目中的工作:
每周,你将会完成 某一个 项目中的 恰好一个 阶段任务。你每周都 必须 工作。
在 连续的 两周中,你 不能 参与并完成同一个项目中的两个阶段任务。
一旦所有项目中的全部阶段任务都完成,或者仅剩余一个阶段任务都会导致你违反上面的规则,那么你将 停止工作 。注意,由于这些条件的限制,你可能无法完成所有阶段任务。
返回在不违反上面规则的情况下你 最多 能工作多少周。
示例 1:
输入:milestones = [1,2,3]
输出:6
解释:一种可能的情形是:
- 第 1 周,你参与并完成项目 0 中的一个阶段任务。
- 第 2 周,你参与并完成项目 2 中的一个阶段任务。
- 第 3 周,你参与并完成项目 1 中的一个阶段任务。
- 第 4 周,你参与并完成项目 2 中的一个阶段任务。
- 第 5 周,你参与并完成项目 1 中的一个阶段任务。
- 第 6 周,你参与并完成项目 2 中的一个阶段任务。
总周数是 6 。
class Solution {
public:
long long numberOfWeeks(vector<int>& milestones) {
/*
将所有元素分为两块,最大的数和(总数-最大的数)
那么 如果最大的数 < (总数 - 最大的数) 说明连最大的数都可以插满,那么ans = sum
如果最大的数 > (总数 - 最大的数)说明 (总数 - 最大的数)产生的(总数 - 最大的数)的缝隙插不满,必定会造成最大的数会有一部份连续
这样最大的合规数 为 *(总数 - 最大的数) + (总数 - 最大的数 + 1)
*/
long long longest = * max_element(milestones.begin(), milestones.end());
long long ans = 0;
for(auto& milestone : milestones){
ans += milestone;
}
// 5 2 1 ans = 8
// return 7
if(longest > ans - longest + 1){
return (ans - longest) * 2 + 1;
}
return ans;
}
};
/*
x << longest
_ | _ | _
*/
有一阵子没有更新了,我在整理自己的博客,然后使用githu page + hugo + theme 搭建静态博客,然后在那里装修
哈哈哈哈
你相信命运吗?为什么人斗不过命?


1188

被折叠的 条评论
为什么被折叠?



