问题描述:一辆汽车加满油后可以行驶n公里,旅途中有加油站,设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。
测试用例:
7 7 (n k)
1 2 3 4 5 1 6 6(第k个加油站与第k-1个加油站之间的距离,其中第一个代表起点,最后一个代表终点。)
输出:
4(最少加油次数)
思路:
贪心原则:能不加油就不加油,没办法时再加油
设置初始状态是加满油的状态,到达一个点,判断这段距离是否超过可行使路程,若没超过,则更新所剩余的油量;直到当前的油量小于两个点的距离,这个时候需要加油,但要考虑到,这个时候加油要在此时所在点的上一个点加油,所以,i-=1;但是这个方法并不是最优的,下面给出两种,第二种是更好的方法
#include<stdio.h>
#include<stdlib.h>
long long n;
long long k;
long long dis[10000001];
long long count=0;
void Car(){
int i,j;
int extra=n;
for(i=0;i<k+1;i++){
if(extra>=dis[i])
extra-=dis[i];
else {
i-=1;
count++;
extra=n;
}
}
}
int main(){
scanf("%lld",&n);
scanf("%lld",&k);
for(int i=0;i<=k;i++)
scanf("%lld",&dis[i]);
Car();
if(count>0){
printf("%lld",count);
}
else
{
printf("-1");
}
return 0;
}
#include <stdio.h>
long long dis[1000001];
long long n;
long long k;
void Car() {
int cnum = 0;
int i,extra;
for(int i = 0;i <= k;i++) {
if(dis[i] > n) {
printf("-1");
return;
}
}
for( i=0,extra=0;i<= k;i++) {
extra += dis[i];
if(extra > n) {
cnum++;
extra = dis[i];
}
}
printf("%lld",cnum);
}
int main() {
int i;
scanf("%lld%lld",&n,&k);
for(i = 0;i <=k;i++)
scanf("%lld",&dis[i]);
Car();
return 0;
}