汽车加油问题

汽车加油问题

时间: 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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注