列表

详情


NC50534. 绿色通道

描述

高二数学《绿色通道》总共有n道题目要抄,编号,抄第i题要花a_i分钟。小Y决定只用不超过t分钟抄这个,因此必然有空着的题。每道题要么不写,要么抄完,不能写一半。下标连续的一些空题称为一个空题段,它的长度就是所包含的题目数。这样应付自然会引起马老师的愤怒,最长的空题段越长,马老师越生气。
现在,小Y想知道他在这t分钟内写哪些题,才能够尽量减轻马老师的怒火。由于小Y很聪明,你只要告诉他最长的空题段至少有多长就可以了,不需输出方案。

输入描述

第一行为两个整数n,t。
第二行为n个整数,依次为

输出描述

输出一个整数,表示最长的空题段至少有多长。

示例1

输入:

17 11
6 4 5 2 5 3 4 5 2 3 4 5 2 3 6 3 5

输出:

3

说明:

原站题解

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

C++ 解法, 执行用时: 850ms, 内存消耗: 780K, 提交时间: 2021-10-17 15:17:24

#include <bits/stdc++.h>
using namespace std;
int f[50005],n,t,a[50005],mid;
bool dp(int x) {
	memset(f,0x3f,sizeof(f));
	int ans=1e9;
	for(int i=1;i<=x;i++)
		f[i]=a[i];
	for(int i=x+1;i<=n;i++)
	for(int j=1;j<=x;j++)
		f[i]=min(f[i-j]+a[i],f[i]);
	for(int i=0;i<x;i++)
		ans=min(f[n-i],ans);
	return ans<=t;
}
int main() {
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	int l=1,r=n;
	while(l<=r) {
		mid=l+r>>1;
		if(dp(mid)) r=mid-1;
		else l=mid+1;
	}
	printf("%d",r);
}

上一题