列表

详情


NC21675. Rabbit的工作(1)

描述

Rabbit大学毕业后找到了一份实习工作,如果实习通过她就转正了。
实习期共有N天,其中有几天公司集体放假,Rabbit不用上班,剩下时间她可以选择工作或者休息。Rabbit工作总是越来越累,可是每当她休息时,她就重新充满了能量。简而言之,Rabbit第一天工作时这一天会消耗体力1,连续第二天工作时这一天会消耗体力2,连续第三天工作时这一天会消耗体力3,以此类推......每当她休息后,工作的第一天又会消耗体力1。
为了让boss满意,Rabbit想工作尽量多的天数,但是懒惰的Rabbit又想让自己的总体力消耗不超过K。 

输入描述

第一行两个整数N,K。

第二行一个长度为N的01字符串。如果第i个字符为‘1’,表示这一天Rabbit可以选择工作或者休息,否则这一天Rabbit放假。

输出描述

输出Rabbit最多能工作的天数。

示例1

输入:

4 2
1011

输出:

2

说明:

第三天和第四天里面休息一天即可,总体力消耗为2

原站题解

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

C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 1120K, 提交时间: 2019-01-11 17:22:42

#include<bits/stdc++.h>
using namespace std;
int n,t,ans;
char s[405];
int dp[405][405];
int main(){
	scanf("%d%d",&n,&t);
	getchar();
	scanf("%s",s+1);
	for(int i=0;i<=n;i++)
		dp[0][i]=1e8;
	dp[0][0]=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dp[i][j]=dp[i-1][j];
			if(s[i]!='0'&&j<=i){
				for(int k=1;k<=j&&s[i-k+1]!='0';k++)
					dp[i][j]=min(dp[max(0,i-k-1)][j-k]+k*(k+1)/2,dp[i][j]);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++)
		if(dp[n][i]<=t)
		ans=i;
	printf("%d\n",ans);
}

C++(g++ 7.5.0) 解法, 执行用时: 30ms, 内存消耗: 1116K, 提交时间: 2023-04-27 15:33:17

#include<iostream>
#include<string.h>
using namespace std;
int f[401][401];
int main()
{
	int n,K;
	string str;
	cin>>n>>K;
	cin>>str;
	memset(f,0x3f3f3f3f,sizeof(f));
	f[0][0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j>=1;j--)
		{
			for(int k=j;k>=1;k--)
			{
				f[j][0]=min(f[j][0],f[j][k]);
				if(str[i-1]=='1')
				f[j][k]=min(f[j][k],f[j-1][k-1]+k);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(f[i][j]<=K)
			ans=i;
		}
	}
	cout<<ans<<endl;
 } 

C++(clang++11) 解法, 执行用时: 29ms, 内存消耗: 1116K, 提交时间: 2020-12-09 18:20:24

#include<bits/stdc++.h>
using namespace std;
const int nx=4e2+5;
int f[nx][nx],n,k;
char s[nx];
int main(){
	scanf("%d%d%s",&n,&k,s+1);
	memset(f,0x3f,sizeof f);
	f[0][0]=0;
	for(int i=1;i<=n;++i)
		for(int j=i;j;--j)
			for(int w=1;w<=j;++w){
				f[j][0]=min(f[j][0],f[j][w]);
				if(s[i]=='1')f[j][w]=min(f[j][w],f[j-1][w-1]+w);
			}
	for(int i=n;~i;--i)
		for(int j=0;j<=i;++j)
			if(f[i][j]<=k){
				printf("%d",i);
				return 0;
			}
} 

上一题