列表

详情


NC15891. iko和她的糖

描述

    iko超级超级喜欢吃糖,有一天iko想出去玩,她计划从1点走到N点(按1,2,3...n的顺序走),每个点都有一个补给站,第i点的补给站有a[i]颗糖,从i点走到i+1点会消耗掉b[i]颗糖,iko在出游的途中可以选择三个补给站,iko想知道她走完全程到达N点时口袋里最多还能剩下几颗糖(初始时iko的口袋里一颗糖都没有)。

输入描述

第一行输入N(3<=N<=1000)
第二行输入N个数代表a[1].......a[N] (0<=a[i]<=1000 )
第三行输入N-1个数代表b[1]......b[N-1] ( 0<=b[i]<=1000 )

输出描述

输出一个数字表示iko到达n点时口袋里最多剩下的糖,
若不能到达N点输出-1。

示例1

输入:

3
1 3 4
3 4

输出:

-1

示例2

输入:

5
3 4 5 2 4
3 2 2 2

输出:

3

原站题解

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

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 480K, 提交时间: 2020-09-28 20:38:39

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int n,max_=-1,a[maxn],b[maxn];
void dfs(int sum,int pos,int ways){
	if(sum<0||ways<0){
		return;
	}
	if(pos==n){
		if(ways>0)max_=max(max_,sum+a[n]);
		else max_=max(max_,sum);
		return;
	}
	dfs(sum+a[pos]-b[pos],pos+1,ways-1);
	dfs(sum-b[pos],pos+1,ways);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<n;i++)cin>>b[i];
	dfs(0,1,3);
	cout<<max_<<endl;
}

Python3 解法, 执行用时: 43ms, 内存消耗: 4728K, 提交时间: 2022-01-24 17:59:49

m=-1
n=int(input())
a=[]
a.append(0)
a1=input().split()
for i in range(n):
    a.append(int(a1[i]))
b=[]
b.append(0)
b1=input().split()
for i in range(n-1):
    b.append(int(b1[i]))

def dfs(x,y,s):
    global m
    if x==n:
        if y<3:
            s=s+a[x]
        m=max(m,s)
        return
    if s>=b[x]:
        dfs(x+1,y,s-b[x])
    if s+a[x]>=b[x] and y+1<=3:
        dfs(x+1,y+1,s+a[x]-b[x])

dfs(1,0,0)
print(m)

C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2023-07-02 16:53:34

#include<bits/stdc++.h>
using namespace std;
int a[1005],b[1005],n;
int sum=0,flag=0,mx=-1;
void dfs(int x,int y,int sum)
{
	if(sum<0)
	{
	return;
}
if(x>n)
{
	mx=max(mx,sum);
	return;
}
    if(y)
    dfs(x+1,y-1,sum+a[x]-b[x]);
    dfs(x+1,y,sum-b[x]);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<n;i++)
	cin>>b[i];
	dfs(1,3,0);
	cout<<mx<<endl;
}

上一题