题目要求 :汽车初始油量为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;
}