codeforces 贪心 Road Widening

2024-01-16 08:20

本文主要是介绍codeforces 贪心 Road Widening,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

 题目大意:一条公路分成 n 个部分,每个部分都有两个参数,路原本的宽度和草地的宽度,现在可以把草地修剪成路面,但修改后的相邻两段路面的宽度差的绝对值不超过 1, 问最多清除多少草地。

算法思想:贪心 or 遍历

        对于每一段路面,我们确定其下界与上界。x[i] 表示 i 段路面的最短宽度, y[i] 表示 i 段路面的最长宽度。

        仅需要一次遍历就可以了吗?

        我们需要从左往右和从右往左都遍历一遍!

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include <numeric>
#include <string>
#define ll long long 
#include<set>
#include<bitset>int main() {int parts; cin >> parts;vector<int> roads(parts); vector<int> lawns(parts);for (int i = 0; i < parts; i++) {cin >> roads[i] >> lawns[i];}// 每一个部分都有一个上界一个下界,画出这些上界和下界,相邻部分只能差 1 或者 0vector<int> x(parts);  // 下界vector<int> y(parts);  // 上界x[0] = roads[0]; y[0] = roads[0] + lawns[0];for (int i = 1; i < parts; i++) {x[i] = max(x[i] - 1, roads[i]);y[i] = min(roads[i] + lawns[i], y[i - 1] + 1);if (x[i] > y[i]) {cout << -1 << endl; return 0;}}for (int i = parts - 2; i >= 0; i--) {x[i] = max(x[i + 1] - 1, x[i]);y[i] = min(y[i + 1] + 1, y[i]);if (x[i] > y[i]) {cout << -1 << endl; return 0;}}ll ans = 0;for (int i = 0; i < parts; i++) {ans += y[i] - roads[i];}cout << ans << endl;for (int i = 0; i < parts; i++) {cout << y[i] << " ";}cout << endl;
}

这篇关于codeforces 贪心 Road Widening的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/611901

相关文章

Codeforces 158B

很久没有刷题了,刚刚有小学弟问了这道题,AC之后贴上来吧。水~~~ #include <cstdio>#include <cmath>int main() {int n;while(scanf("%d", &n) != EOF) {int a = 0, b = 0, c = 0, d = 0;int arr[100001];for (int i = 0; i < n; ++

Codeforces April Fools Day Contest 2014(附官方题解)

Codeforces2014年愚人节的坑题。。。但还是感觉挺好玩的。。。 A. The Great Game time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Two teams mee

Codeforces April Fools Day Contest 2013

2013年愚人节的坑题。。。 A. Mysterious strings time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Input The input contains a sin

贪心推公式——AcWing 125. 耍杂技的牛

贪心推公式 定义 贪心算法是一种在每一步选择中都采取在当前状态下最优的选择,希望通过局部的最优选择来得到全局最优解的算法策略。 运用情况 问题具有最优子结构,即一个问题的最优解包含其子问题的最优解。可以通过局部最优决策逐步推导到全局最优。问题的选择策略相对明确且易于计算。 注意事项 贪心算法并不总是能得到全局最优解,可能会陷入局部最优。对于一些复杂问题,需要谨慎验证其正确性。可能需要对

道路 Road(百练,POJ)

题目链接: 1724 -- ROADS (poj.org) 题目描述: 思路: 这题目乍一看,是一个含有2个标尺的单源最短路问题,挺难处理的。 既然没法直接用最短路处理,那我们就“记录信息”,将花费的时间也记录进dp数组,然后跑“状态最短路”。 用f[i][j] 表示到达点i 且 总花费时间为j的最短距离,然后跑堆优化的dijkstra算法就好。由于不含有负边权,因此可以搞一个vis数

代码随想录第31天|贪心算法

134. 加油站 参考 思路: 以每个油站相差作为判断, 比如: gas [5 8 2 8]cost [6 5 6 6] [-1 3 -4 2] 错误 : 把相差最大点当作起点判断能否绕一圈 : 相加数组是否小于0局部最优: 当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行全局最优: 找到可以跑一圈的起始位置 class

贪心算法—

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。这种算法并不总是能找到全局最优解,但在某些问题上能提供足够好的解决方案。贪心算法的关键特性包括: 局部最优选择:在每一步决策时,都选择当前看来最佳的解决方案,不考虑长远的影响。无后效性:过去做出的选择不会影响未来的选择,也就是说,当前的最优选择不会因为之前做了

算法之广度优先,深度优先,拓扑,贪心,并查集

文章目录 1 图算法1.1 广度优先搜索1.2 深度优先搜索1.3 拓扑排序1.4 贪心算法1.4.1 定义1.4.2 示例 1.5 并查集(不相交集合数据结构)1.5.1 并查集讲解1.5.2 Kruskal算法1.5.3 Prim算法 1.8 Bellman-Ford算法 1 图算法 地图数据常常可以用图(Graph)这类数据结构表示,那么在图结构中常用的搜索算法也可以应用

贪心+动归1

​​​​​​​​​​​​​​跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 class Solution {public boolean canJump(int[] nums) {// 跳跃覆盖范围究竟可不可以覆盖到终点!//

[POJ 3764] The xor-longest Path (Tire树 + 贪心)

POJ - 3674 题意是给你一个树,每条边有一个权值,求得树上一条路径,使路径上每条边权值的异或和最大 首先用一个 DFS把根到任意点的路径的异或和求出来 xorv[i] 由异或的性质可得点 u和点 v的异或和即为 xorv[u]^xorv[v] ( 根到两点 LCA的异或和会消去) 然后问题就转化成在区间内找两个值,使得他们的异或和最大 与 LightOJ - 1269一样的做法,