小米B最优分割

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#pragma warning(disable:4996)

#define Zero(a) memset(a, 0, sizeof(a))
#define Neg(a)  memset(a, -1, sizeof(a))
#define All(a) a.begin(), a.end()
#define PB push_back
#define repf(i,a,b) for(i = a;i <= b; i++)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define root 1,n,1
#define ld rt << 1
#define rd rt << 1 | 1
#define ll long long
#define MAXN 1010
#define mod 1000000007
#define inv2 500000004
#define sqrtt(x) (ll)(x)*(x)
#define dist(x1,y1,x2,y2) (sqrtt(x1-x2)+sqrtt(y1-y2))

using namespace std;
vector<ll>nums;
bool can_split(int m, ll sum) {
int cnt = 1;
ll curSum = 0;
for (int i = 0; i < nums.size(); ++i) {
curSum += nums[i];
if (curSum > sum) {
curSum = nums[i];
++cnt;
if (cnt > m) return false;
}
}
return true;
}
ll splitArray(int m) {
long long left = 0, right = 0;
for (int i = 0; i < nums.size(); ++i) {
left = max(left, nums[i]);
right += nums[i];
}
while (left < right) {
long long mid = (left + right) / 2;
if (can_split(m, mid)) right = mid;
else left = mid + (ll)1;
}
return left;
}
int n, m;
int main(){
ll dd;
//freopen("in.txt","r", stdin);
//freopen("out.txt", "w", stdout);
ios::sync_with_stdio(false);
while (cin >> n >> m) {
nums.clear();
for (int i = 0; i < n; ++i) {
cin >> dd;
nums.push_back(dd);
}
ll ans;
ans = splitArray(m);
cout << ans << endl;
}
return 0;
}

#小米#
全部评论
leetcode410号问题,前几天刚做,不过我没参加小米招聘...这题标签难度是hard,不过也算dp中难度还ok的题目,可以去英文版的leetcode上面看下外国大牛的解答,我也是看了解答自己摸索出来的
点赞 回复 分享
发布于 2018-09-21 00:30
百度“leetcode 410.”
点赞 回复 分享
发布于 2018-09-20 23:43
if __name__ == "__main__": n, m = map(int, input().split()) nums = list(map(int, input().split())) acc_sum = [0] for item in nums: acc_sum.append(acc_sum[-1] + item) dp = [[float("inf")] * (1 + len(nums)) for _ in range(m + 1)] dp[0][0] = 0 for i in range(1, m + 1): for j in range(1, len(nums) + 1): for k in reversed(range(i - 1, j)): val = max(dp[i - 1][k], acc_sum[j] - acc_sum[k]) dp[i][j] = min(val, dp[i][j]) print(dp[m][len(nums)])
点赞 回复 分享
发布于 2018-09-20 21:22
通过91%,有没有大手子解释一下
点赞 回复 分享
发布于 2018-09-20 20:34

相关推荐

其实本来打算等lastday的时候再写的,但是现在提笔写下这篇总结完全是出于自己的想法,今天上午自己被学校发的签到吵醒时才突然想明白了很多事情,遂决定写下本文进行总结,虽然现在顶多算2.5个月,但也大差不差喵。回看这段时间的日常实习,我的关键词是:遗憾,焦虑。当然也有快乐的时候,不过大部分时间都是前面这两种情绪主导。为了避免后人再次踩坑,我将在本文详细解释我遇到的困难&nbsp;+&nbsp;产生的原因&nbsp;+&nbsp;应对的措施。同时总结新人实习时除了业务本身,还有如何处理生活与工作上的平衡,调控自身的情绪,让自己恢复到最好的工作状态。本文不会教你实习怎么去做产出,因为有产出的前提是你的心态足够健康,且在工作之余还有时间去...
wuwuwuoow:你的经历跟挺像,但我实力远没你强,现在只能干外包。但解决焦虑这块我应该比你更有经验,因为我曾经也非常迷茫和焦虑: 1.规律作息。无论节假日,都必须在同一时间点睡觉,同一时间点起床。放假睡的多,工作睡的少,这就是典型的作息不规律。将直接干扰前额叶皮层功能,导致情绪波动(易怒、焦虑)。无论上班还是周末,我都是 11:30 睡,7 点起床。7.5h 睡眠,完全足够了。 2.运动。缓解压力,强身健体,提高免疫力。不要觉得每天没有时间锻炼,都是懒惰的借口。 3.冥想。长期练习会增厚前额叶皮层(理性决策区),缩小杏仁核体积(减少情绪过敏反应,核心),增强情绪调控能力。 方法很简单,任何时候都能做。就是闭上眼睛,只专注自己的呼吸,不去想其他任何事情。你可以尝试一下,你会发现非常难只专注呼吸,会有大量的想法涌现出来(什么走马灯),不要去压抑它们,而是放平心态,把注意力继续放在呼吸上面。 而且最重要的是,冥想让你学会“活在当下”。因为处于冥想的你,除了专注呼吸你还能做什么呢?你什么都做不了。生活也是这样,我们无法改变过去,无法预知未来会发生什么,我们能做的只有手头的事情,除此之外什么都别想,因为你无法去改变它们。 4.工作与生活分离。工作不是生活的全部,生活可不是只有工作。像我放假的时候,从不带电脑回去。放假该玩就玩吧。 上面要是都能做到,其实完全解决不了你工作上的问题,完不成的需求还是完不成,面试该挂还是得挂。不过呢,当你再次迷茫,再次焦虑的时候,你会发现,诶,还好,没这么难受。比如面试挂了,可能以前的你会感觉非常难受。但如果你做到以上 4 点,你还是会难受的,但其实又没这么难受,可能你会这样想:既然挂了我还能怎么样?这公司不要我,有的是公司要我!
投递腾讯等公司6个岗位 >
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务