C语言算法——加油站问题

题目要求 :汽车初始油量为0,设定任意个加油站,每个加油站拥有两个数值(1,可以加的油量gas 2,开往下一个加油站所需要消耗的油量cost),求得可以 完整 使汽车开完一个周期的 起始加油站 的下标。

实现思路 :因为加油站一样,则gas,cost数组每次使用的下标是一样的,开始油量为开始加油站的gas,设汽车油量为k,每次到下个加油站的油量即为k+gas[i]-cost[+1],历遍所有,判断最后油量k是否大于0

注意事项:1,初始gas必须>cost,不然开汽车不出去,我们可以将满足的点存为数组,用作循环

for (i = 0; i < n; i++)
{
	if (g[i] > c[i])
	{
		r[num] = i;
		num++;
	}
}

2,每次开到下一个加站之前都要判断油量k是否充足

if (k < 0)
{
	break;
}

3,由于初始油量k为初始gas,我们需要判断能否进行第一次开车,所以先将第一次计算

if ((r[0] + 2)<=n)
{
	k = g[r[p]] - c[r[p]] + g[r[p] + 1];
}
if (r[0] == n - 1)
{
	k = g[r[0]] - c[r[0]] + g[0];
}

*4,重点,因为每次计算为gas[i],cost[i+1],所以会有两次变化,来保证在数组内循环

if (i == n - 1)
{
    sum = 0;
}
if (i == n)
{
    i = 0;
    sum = 1;
}
k = k - c[i] + g[sum];

5,要确保循环完一遍,并k大于最后一次开车的cost,

if (count == n - 2 && k >= c[r[p] - 1])
{
	return r[p];
}

完整代码如下

(可用#define _CRT_SECURE_NO_WARNINGS 1来防止vs的-s报错)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int gasstation(int* g, int* c, int n,int* r)
{
	int i, j, k;
	int p = 0;
	int num = 0;
	int sum = 0;
	for (i = 0; i < n; i++)
	{
		if (g[i] > c[i])
		{
			r[num] = i;
			num++;
		}
	}
	if (num == 0)
	{
		return -1;
	}
	j = sizeof(r) / sizeof(r[0]);
	if ((r[0] + 2)<=n)
	{
		k = g[r[p]] - c[r[p]] + g[r[p] + 1];
	}
	if (r[0] == n - 1)
	{
		k = g[r[0]] - c[r[0]] + g[0];
	}
	for (p = 0; p < j; p++)
	{
		i = r[p] + 1;
		int count = 0;
		while (i != (r[p]-1))
		{
			sum = i + 1;
			if (i == n - 1)
			{
				sum = 0;
			}
			if (i == n)
			{
				i = 0;
				sum = 1;
			}
			k = k - c[i] + g[sum];
			if (k < 0)
			{
				break;
			}
			count++;
			i++;
		}
		if (count == n - 2 && k >= c[r[p] - 1])
		{
			return r[p];
		}
	}
}
int main()
{
	int cost[] = { 3,4,5,1,2 };
	int gas[] = { 1,2,3,4,5 };
	int re[] = { 0 };
	int a = gasstation(gas, cost, 5, re);
	printf("%d", a);
	return 0;
}

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值