[CSP-J 2023] 公路
[CSP-J 2023] 公路【民间数据】
题目描述
小苞准备开着车沿着公路自驾。
公路上一共有
公路上每个站点都可以加油,编号为
小苞想从站点
输入格式
输入的第一行包含两个正整数
输入的第二行包含
输入的第三行包含
输出格式
输出一行,仅包含一个正整数,表示从站点
样例 #1
样例输入 #1
5 4
10 10 10 10
9 8 9 6 5
样例输出 #1
79
提示
【样例 1 解释】
最优方案下:小苞在站点
【样例 2】
见选手目录下的 road/road2.in 与 road/road2.ans。
【数据范围】
对于所有测试数据保证:
| 测试点 | 特殊性质 | |
|---|---|---|
| 无 | ||
| 无 | ||
| A | ||
| B | ||
| 无 |
- 特殊性质 A:站点
1 的油价最低。 - 特殊性质 B:对于所有
1 \leq i < n ,v_i 为d 的倍数。
思路:
题目让我们求的是买油用的最少的钱 ( 且要到达终点 ) ,而且已知车的速度一直都不变,那么我们就得使每次的油价最小,所以就应该用到贪心。
首先我们要将从起点到第
代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x = 0x7fffffff,ans;
int c[1000005]; //储存距离
int v; //储存油价
int w[1000005]; //储存从第起点到底 i 个点所需几升油
signed main(){
ios::sync_with_stdio(0); //输入输出优化
cin.tie(0);
cout.tie(0);
cin >> n >> m; //输入
for(int i=1;i<n;i++){
cin >> c[i];
c[i] += c[i-1]; //用前缀和记录路程
if(c[i] % m != 0){ //向上取整
w[i]++;
}
w[i] += c[i] / m; //记录油量
}
for(int i=1;i<=n;i++){
cin >> v;
x = min(x,v); //贪心,使每次能用之前最小的油价
ans += (w[i] - w[i-1]) * x; //累加每次用的钱
}
cout << ans; //输出
return 0;
}