列表

详情


NC206123. 任务安排

描述

    小明有天的时间按给定顺序依次完成项工作,完成每项工作需要一定时间。同时,在每一天他有一次机会求助朋友完成一项工作,这样他无需花费这项工作的时间。

    请问天中小明工作时间最长的那一天最少工作几个小时?

输入描述

第一行两个数
第二行个数,表示每项工作所需要的时间

输出描述

一个数,表示小明工作时间最长的那一天最少工作几个小时。

示例1

输入:

4 2
1 2 3 3

输出:

3

说明:

第一天做前3项工作,并且第三项工作向朋友求助,第二天做最后一项工作并求助。

示例2

输入:

3 4
999 999 999

输出:

0

说明:

每天做一项工作并求助。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 21ms, 内存消耗: 860K, 提交时间: 2020-05-10 14:12:55

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
int n,m,l,r;
int a[100010];
bool chk(int x){
	int now=1;
	rep(i,1,m){
		int sum=a[now],mx=a[now];
		while(sum-mx<=x&&now<=n){
			now++;
			sum+=a[now];
			mx=max(mx,a[now]);
		}
	}
	return (now==n+1);
}
int main(){
	cin>>n>>m;
	rep(i,1,n)	scanf("%d",a+i);
	l=-1;r=1e9+7;
	while(r-l>1){
		int mid=(r+l)/2;
		if(chk(mid)){
			r=mid;
		}	
		else{
			l=mid;	
		}
	}
	printf("%d\n",r);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 28ms, 内存消耗: 984K, 提交时间: 2020-05-10 15:39:10

#include<bits/stdc++.h>
using namespace std;
int n,m;
int t[1000005];
int check(int mid)
{
	int mx=0,cnt=1,sum=0;
	for(int i=1;i<=n;i++)
	{
		mx=max(mx,t[i]);
		if(sum+t[i]-mx<=mid) sum+=t[i];
		else
		{
			cnt++;
			mx=t[i];
			sum=t[i];
		}
	}
	if(cnt<=m) return 1;
	else return 0;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%d",&t[i]);
	int l=0,r=1e9+5,mid;
	while(l<r)
	{
		mid=(l+r)/2;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	printf("%d\n",l);
	return 0;
}

上一题