汽车加油问题
时间: 1ms 内存:64M
描述:
一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。并证明算法能产生一个最优解。
对于给定的n和k个加油站位置,计算最少加油次数。
输入:
输入数据的第一行有2 个正整数n和k(n≤5000,k≤1000),表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。
输出:
将计算出的最少加油次数输出。如果无法到达目的地,则输出“No Solution!”。
示例输入:
7 7
1 2 3 4 5 1 6 6
示例输出:
4
提示:
参考答案(内存最优[804]):
#include<stdio.h>
#define MAX_NUM 1010
int array[MAX_NUM];
int n,k;
int greedy()
{
int start = 0;
int total = 0;
int rest_oil = n;
while(start <= k)
{
if(rest_oil < array[start])
{
rest_oil = n;
++total;
if(rest_oil < array[start])
break;
}
rest_oil -= array[start];
++start;
}
if(start != k + 1)
return -1;
else
return total;
}
int main()
{
int i;
int result = 0;
scanf("%d%d",&n,&k);
for( i = 0;i <= k;++i)
{
scanf("%d",&array[i]);
}
result = greedy();
if(result == -1)
printf("No Solution!\n");
else
printf("%d\n",result);
return 0;
}
参考答案(时间最优[0]):
#include<stdio.h>
int minmin(int a,int b)
{
if (a>=b) return b;
else return a;
}
int main()
{
int n,k,dis[1010],i,j,min=20000,num,time=0;
long long int sum=0;
scanf("%d %d\n",&n,&k);
for (i=1;i<=k+1;i++)
{
scanf("%d",&dis[i]);
if (dis[i]>n) {printf("No Solution!");return 0;}
sum+=dis[i];
}
num=n;
for (i=1;i<=k+1;i++)
if (num>=dis[i]) num=num-dis[i];
else {num=n-dis[i];time=time+1;}
if (sum<=n) time=0;
printf("%d",time);
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。