C++:徒步旅行中的补给问题(求助)

题目:

小R正在计划一次从地点A到地点B的徒步旅行,总路程需要 N 天。为了在旅途中保持充足的能量,小R每天必须消耗1份食物。幸运的是,小R在路途中每天都会经过一个补给站,可以购买食物进行补充。然而,每个补给站的食物每份的价格可能不同,并且小R最多只能同时携带 K 份食物。

现在,小R希望在保证每天都有食物的前提下,以最小的花费完成这次徒步旅行。你能帮助小R计算出最低的花费是多少吗?

样例1:

输入:n = 5 ,k = 2 ,data = [1, 2, 3, 3, 2]
输出:9

样例2:

输入:n = 6 ,k = 3 ,data = [4, 1, 5, 2, 1, 3]
输出:9

样例3:

输入:n = 4 ,k = 1 ,data = [3, 2, 4, 1]
输出:10

因为我还没有学dp,所以我对题目进行了推算:

我用变量len记录小R的位置,food记录小R身上有的食物,count记录小R的花费。

  1. 当小R到达的补给站中的价格比后续补给站高的时候,在这里买肯定是吃亏的,因此我们需要判断此时小R身上有没有食物(food变量中);
    1. 如果有:就不买食物,等下一个更便宜的;
    2. 如果没有:就买一次食物,足够支撑到下一个更便宜的。
  2. 当小R到达的补给站中的价格不低于后面的补给站的时候,可以开始囤货
    即从本补给站到小R身上的食物能撑到的远的补给站(len + k)的判断;
    1. 如果低于,那么囤货停止,等到更低的位置再进行囤货。
    2. 如果不低于小R本次的补给站费用(data[len]),那么可以为该补给站囤货(这时候需要判断小R身上的食物有没有超出限制k与多带了食物);
      1. 如果小R身上的食物没到上限(food  < k)并且没有多带食物(n > len + food 也就是带的食物能走的天数小于走出的天数),那么囤货;
      2. 如果有一个不满足,那么后面也不需要判断,可以直接break掉
  3. 最后每轮减去一份食物,增加一格距离。

这样的思路我在devc中完成了一份代码:

#include<iostream>
#include<vector>

using namespace std;

void solve(){
	int n, k;
	cin >> n >> k;
	int data[n];
	for(int i = 0; i< n; i++){
		cin >> data[i];
	} 
	int food = 0, count = 0, len = 0;
	while(len < n){
		//后者便宜,只买一次 
		if(data[len] > data[len+1] && food == 0){
			food ++;
			count += data[len];
		}else if(data[len] <= data[len+1]){
			for(int j = len; j < len + k; j ++){
				if(data[len] <= data[j]){
					if(food < k && n > len + food){
						food ++;
					}else{
						break;
					}
					count += data[len];
				}
			}
		}
		food --;
		len ++;
	}
	cout << count << endl;
}

int main(){
	ll t;
	cin >> t;
	while(t--){
		solve();
	}
	return 0;
}

在devc中的运行也是没有问题的;

因此我将其移动到了豆包里面:

#include <iostream>
#include <vector>

int solution(int n, int k, std::vector<int> data) {
    // Edit your code here
	int food = 0, count = 0, len = 0;
	while(len < n){
		if(data[len] > data[len + 1] && food == 0){
			food ++;
			count += data[len];
		}
		else if(data[len] <= data[len + 1]){
			for(int j = len; j < len + k; j++){
				if(data[len] <= data[j]){
					if(food < k && n > len + food){
						food ++;
					}else {
						break;
					}
					count += data[len];
				}
			}
		}
		food --;
		len ++;
	}
    return count;
}

int main() {
    // Add your test cases here

    std::cout << (solution(5, 2, {1, 2, 3, 3, 2}) == 9) << std::endl;
    return 0;
}

这个内容在样例测试的时候是没有问题的——可以输出1

但是当提交的时候会直接运行错误:

因此想向各位大佬们求助一下这个提交结果错误的原因。

麻烦各位大佬看一看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值