首页 > 其他分享 >【NOIP2023普及组复赛】题2:公路

【NOIP2023普及组复赛】题2:公路

时间:2024-06-12 18:59:31浏览次数:12  
标签:10 普及 last 站点 dist NOIP2023 105 复赛 dis

题2:公路

【题目描述】

小苞准备开着车沿着公路自驾。

公路上一共有 n n n 个站点,编号为从 1 1 1 到 n n n。其中站点 i i i 与站点 i + 1 i + 1 i+1 的距离为 v i v_i vi​ 公里。

公路上每个站点都可以加油,编号为 i i i 的站点一升油的价格为 a i a_i ai​ 元,且每个站点 只出售整数升的油。

小苞想从站点 1 1 1 开车到站点 n n n,一开始小苞在站点 1 1 1 且车的油箱是空的。已知车的 油箱足够大,可以装下任意多的油,且每升油可以让车前进 d d d 公里。问小苞从站点 1 1 1 开 到站点 n n n,至少要花多少钱加油?

输入格式

输入的第一行包含两个正整数 n n n 和 d d d,分别表示公路上站点的数量和车每升油可以前进的距离。

输入的第二行包含 n − 1 n − 1 n−1 个正整数 v 1 , v 2 . . . v n − 1 v_1, v_2 . . . v_{n−1} v1​,v2​...vn−1​,分别表示站点间的距离。

输入的第二行包含 n n n 个正整数 a 1 , a 2 . . . a n a_1, a_2 . . . a_n a1​,a2​...an​,分别表示在不同站点加油的价格。

输出格式

输出一行,仅包含一个正整数,表示从站点 1 1 1 开到站点 n n n,小苞至少要花多少钱加油。

输入样例1

5 4 10 10 10 10 9 8 9 6 5 ```

输出样例1

79 ```

【样例 1 说明】

最优方案下:小苞在站点 1 1 1 买了 3 3 3 升油,在站点 2 2 2 购买了 5 5 5 升油,在站点 4 4 4 购买了 2 2 2 升油。

【数据规模与约定】

对于所有测试数据保证: 1 ≤ n ≤ 1 0 5 , 1 ≤ d ≤ 1 0 5 , 1 ≤ v i ≤ 1 0 5 , 1 ≤ a i ≤ 1 0 5 1≤n≤10^5 ,1≤d≤10^5 ,1≤v_i≤10^5 ,1≤a_i≤10^5 1≤n≤105,1≤d≤105,1≤vi​≤105,1≤ai​≤105 。

测试点编号 n ≤ n \leq n≤特殊性质
1 ∼ 5 1 \sim 5 1∼5 8 8 8
6 ∼ 10 6 \sim 10 6∼10 1 0 3 10^3 103
11 ∼ 13 11 \sim 13 11∼13 1 0 5 10^5 105 A A A
14 ∼ 16 14 \sim 16 14∼16 1 0 5 10^5 105 B B B
17 ∼ 20 17 \sim 20 17∼20 1 0 5 10^5 105

特殊性质 A A A:站点 1 1 1 的油价最低。

特殊性质 B B B:对于所有 1 ≤ i < n , v i 1≤i<n,v_i 1≤i<n,vi​ 为 d d d 的倍数。

【代码如下】:

#include <cstdio>

typedef long long ll;

const int N = 1e5 + 5;

ll n, d;
ll dis[N], money[N], nxt[N], dis_sum[N], can_dis, ans;

int main()
{
	scanf("%lld %lld", &n, &d);
	ll i, dist, last_m, last_i;
	for (i = 1; i < n; i++)
		scanf("%lld", &dis[i]);
	for (i = 2; i <= n; i++)
		dis_sum[i] = dis_sum[i - 1] + dis[i - 1];
	for (i = 1; i <= n; i++)
		scanf("%lld", &money[i]);
	last_m = money[1];
	last_i = 1;
	for (i = 2; i <= n - 1; i++)
	{
		if (money[i] < last_m)
		{
			nxt[last_i] = i;
			last_i = i;
			last_m = money[i];
		}
	}
	nxt[last_i] = n; 
	for (i = 1; i < n;)
	{
		dist = dis_sum[nxt[i]] - dis_sum[i];
		ans += (dist - can_dis + d - 1) / d * money[i];
		can_dis += (dist - can_dis + d - 1) / d * d; 
		can_dis -= dist;
		i = nxt[i];
	}
	printf("%lld\n", ans);
	return 0;
}

标签:10,普及,last,站点,dist,NOIP2023,105,复赛,dis
From: https://blog.csdn.net/lpstudio/article/details/139632888

相关文章

  • CSP历年复赛题-P5662 [CSP-J2019] 纪念品
    原题链接:https://www.luogu.com.cn/problem/P5662题意解读:n件物品,t天每天有不同的价格,类似股票,初始有m金币,每天都可以无限次买卖,问最后最多可以达到多少金币。解题思路:考试中一定要学会面向数据编程!1、对于 10%10% 的数据,......
  • 知识普及:什么是边缘计算(Edge Computing)?
            边缘计算是一种分布式计算架构,它将数据处理、存储和服务功能移近数据产生的边缘位置,即接近数据源和用户的位置,而不是依赖中心化的数据中心或云计算平台。边缘计算的核心思想是在靠近终端设备的位置进行数据处理,以降低延迟、减少带宽需求、提升数据隐私和增强......
  • CSP历年复赛题-P5661 [CSP-J2019] 公交换乘
    原题链接:https://www.luogu.com.cn/problem/P5661题意解读:坐一次地铁得到一张优惠券,坐公交可以已使用金额大于等于票价的优惠券,优惠券45分钟之内有效,计算所有乘车记录的总花费。解题思路:采用队列记录所有坐地铁得到的优惠券;每次都将过期优惠券从队列中踢出,保证队列里的优惠券......
  • CSP历年复赛题-P5018 [NOIP2018 普及组] 对称二叉树
    原题链接:https://www.luogu.com.cn/problem/P5018题意解读:找到是对称二叉树的最大子树节点数。解题思路:1、先统计每一个节点为子树的节点数intdfs1(introot){if(root==-1)return0;returncnt[root]=dfs1(tree[root].l)+dfs1(tree[root].r)+1;}2、再......
  • 2002NOIP普及组真题 2. 选数
    线上OJ:【02NOIP普及组】选数核心思想:1、使用模板函数isPrime()来判断一个数是否为素数。2、定义一个函数dfs来进行深度优先搜索。在dfs函数中,通过递归的方式遍历所有可能的组合,并计算每个组合的和。在dfs中:如果坐标id超过n,则越界,返回。如果已选了k个数,且......
  • CSP历年复赛题-P5017 [NOIP2018 普及组] 摆渡车
    原题链接:https://www.luogu.com.cn/problem/P5017题意解读:先将问题进行抽象、建模。设一条数轴,从左到右,每个点对应一个时刻,每个时刻可能有多个人到达,然后有若干个发车时刻,每两个发车时刻间隔必须>=m,每个人的等待时长就是到最近一个发车时刻的时间累加,计算所有人等待时间最小值。......
  • CSP历年复赛题-P3957 [NOIP2017 普及组] 跳房子
    原题链接:https://www.luogu.com.cn/problem/P3957题意解读:有n个格子,每个格子有不同的距离和分数,从起点,每次可跳距离为d,用g金币后可跳距离范围可以变成max(d-g,1)~d+g,求最小的g,使得可跳跃得分不少于k。解题思路:1、单调性分析:如果g越大,可跳跃的范围就越大,理论上能得的分数越......
  • 计数问题(普及)
    描述试计算在区间[1,n]的所有整数中,数字x(0<=x<=9)共出现了多少次?例如,在1到11中,即在1、2、3、4、5、6、7、8、9、10、11中,数字1出现了4次。输入描述共1行,包含2个正整数n、x,之间用一个空格隔开。输出描述共一行,包含一个整数,表示x出现的次数。用例输入1111用例输出14......
  • CSP历年复赛题-P3956 [NOIP2017 普及组] 棋盘
    原题链接:https://www.luogu.com.cn/problem/P3956题意解读:计算从(1,1)走到(m,m)的最小花费,有几个限定:同色格子可以走,花费为0;不同色格子可以走,花费为1;有色格子可以走到无色格子,花费为2,且用将无色格子临时染色;无色格子不能走到无色格子。解题思路:可以采用DFS来暴搜所有路径,需......
  • CSP历年复赛题-P3955 [NOIP2017 普及组] 图书管理员
    原题链接:https://www.luogu.com.cn/problem/P3955题意解读:给出n个图书编号,q个需求码,找到后缀与需求码匹配的最小图书编号,没有输出-1。解题思路:先对图书编号排序,用枚举法遍历每一个图书编号,看后缀是否与需求码相同。100分代码:#include<bits/stdc++.h>usingnamespacestd;c......