7-40 汽车加油问题 (20 分)
题目来源:王晓东《算法设计与分析》
一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。
输入格式:
第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。
输出格式:
输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。
输入样例:
7 7
1 2 3 4 5 1 6 6
输出样例:
4
反思与总结:此题看了一会不知道为啥有8个节点,后来才发现,是开始和尾部,然后,0到目的地的距离,后来发现对了。然后,开始抱着试试的 态度,写了一下 ,大致思路如下:开始定义一个计数器,然后定义一个变量,然后定义一个求和,当求和大于n,然后把上一步i减一。具体代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader sr = new BufferedReader(new InputStreamReader(System.in));
int sum =0;
int count = 0;
int flag =0;
int n = Integer.parseInt(sr.readLine().split(" ")[0]); //得到n的值也就是能跑多少距离
String s [] = sr.readLine().split(" "); //输入一行距离
int ff[] = new int [s.length];
for(int i=0;i<s.length;i++) {
ff[i]=Integer.parseInt(s[i]); //把各个距离转为整数,为什么这样转,因为Scanner太浪费时间了
}
for(int i=0;i<ff.length;i++) {
sum=sum+ff[i]; //累计求和
if(ff[i]>n) { //如果大于n说明距离跑不到直接退出就行了
flag=1; //定义变量的输出方式
break;
}
if(sum>n) {
count=count+1;//如果大于n说明下一个肯定不行所以加一,然后退到上一个
sum=0;
i--;
}
}
if(flag==1) {
System.out.println("No Solution!");
}else{
System.out.println(count);
}
}
}