问题描述
小明想从A徒步到B,总路程需要M天,路程中为了确保安全,小明每天需要消耗1份食物。
在起点及路程当中,零星分布着N个补给站,可以补充食物,不同补给站的食物价格可能不同。
请问小明若要安全完成徒步,最少需要花费多少钱呢?
输入格式
第一行为两个正整数M、N,代表总路程M天,补给站个数N
接下来N行,每行有两个非负整数A、B代表一个补给站,表示第A天经过该补给站,每份食物的价格为B元。
A是从0开始严格递增的,即起点一定有补给站,补给站是按位置顺序给出的,且同一个位置最多有一个补给站。
输出格式
输出一个整数,表示最少花费的金额
输入样例
5 4
0 2
1 3
2 1
3 2
输出样例
7
说明:在第0天买2份食物,在第2天买3份食物,共花费7元
数据范围
- 30%的数据,
N <= M <= 100,0 <= A < M,0 <= B <= 1000 - 80%的数据,
N <= M <= 10000,0 <= A < M,0 <= B <= 1000 - 100%的数据,
N <= M <= 1000000,0 <= A < M,0 <= B <= 1000
题目理解
M天路程,每天要吃一份食物。在M天内有若干补给站来购买食物,食物有对应的价格,要求出顺利走完M天最少需要花费多少钱。关键点:补给站不一定连续有,也就是说第一天有,第二天不一定有。第0天一定有。第0天一定得买食物,不然走不了
思路
定义一个一维数组cost[M+1],cost[i]表示第i天的最少花费金额,则cost[M]就是最终结果。然后就要思考第i天的最少花费要怎么得到? 是不是就是从第j天(j属于[0,i-1])到达第i天中,第j天有补给站的情况下的最少花费,所以我们就遍历前i-1天,计算每个的花费,其中的最小值就是第i天的最小花费。从第j天到达第i天的花费=cost[j]+第j天的食物单价*(i-j)。 cost[0]赋值为0,第0天的花费金额为0,不用动就在第0天。其余赋值为Integer.MAX_VALUE
//计算每天的最小金额
for(int i=0;i<=m;i++){
//遍历前i天,看从哪一天到第i天的金额最小
for(int j=0;j<n;j++){
//前i天中,没有补给站的天不能遍历,因为从该天到达不了第i天
if(p[j][0]<=i){
//其余赋值为Integer.MAX_VALUE的用处在这
cost[i]=Math.min(cost[i],cost[p[j][0]]+p[j][1]*(i-p[j][0]));
}
}
}
最后cost[M]就是结果