Educational Codeforces Round 158 B. Chip and Ribbon (贪心)

有一条带子,分为 n 个单元格,从左到右编号为 1 至 n 。最初,每个单元格中都写入了一个整数 0 。

单细胞与芯片玩游戏。游戏由几个回合组成。在第一轮中,Monocarp 将芯片放入色带的 1 -st 单元中。除了第一轮之外,在每一轮中,Monocarp 都会做以下两个动作中的一个:

将芯片移动到下一个单元格(例如,如果芯片在 i 单元格,则将其移动到 i+1 单元格)。如果芯片位于最后一个单元格,则无法执行此操作;

选择任意一个单元格 x ,将芯片传送至该单元格。可以选择芯片当前所在的单元格。

每回合结束时,写入芯片所在单元格的整数会增加 1 。

Monocarp的目标是在某些回合中, 1 -st单元格中包含整数 c1 , 2 -nd单元格中包含整数 c2 ,..., n -th单元格中包含整数 cn 。他希望尽可能少地传送芯片。

请帮助 Monocarp 计算他传送芯片的最少次数。

输入

第一行包含一个整数 t ( 1 ≤ t ≤ 1 0 4 ) t ( 1≤t≤10^4 ) t(1≤t≤104) - 测试用例数。

每个测试用例由两行组成:

第一行包含一个整数 n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n ( 1≤n≤2⋅10^5 ) n(1≤n≤2⋅105);

第二行包含 n n n 个整数 c 1 , c 2 , ... , c n ( 0 ≤ c i ≤ 1 0 9 ; c 1 ≥ 1 ) c_1,c_2,...,c_n ( 0≤c_i≤10^9 ; c_1≥1 ) c1,c2,...,cn(0≤ci≤109;c1≥1)。可以证明,在这些限制条件下,总是可以进行有限次的转动,从而使单元格中的整数与序列 c 1 , c 2 , ... , c n c_1,c_2,...,c_n c1,c2,...,cn 一致。

输入的附加限制:所有测试用例中 n n n 的值之和不超过 2 ⋅ 1 0 5 2⋅10^5 2⋅105 。

输出

对于每个测试用例,打印一个整数 - Monocarp 传送芯片的最少次数。


这个问题可以抽象为:将一个全为0的数组加成给定的数组,每次可以对从前往后的连续段加1,如果要跳过一个数就要加一步数,从头开始再来也要加一步数,求最小步数。

那么很容易想到一种贪心策略,只要每次扫完我们都尽量跳转到最左边要加的数就可以了。

首先思考,对于 c 1 c_1 c1 ,我们一定会需要的步数是 c 1 − 1 c_1 - 1 c1−1,在之后的过程中,我们会遇见两种情况。

一种情况是递减,另一种是递增。

如果当前是递增,那么必定会导致出现,当前的值变成0了,但是后面的值还不为0,这时候就会导致传送的操作,并且操作次数至少是后面的值比当前值大的差值。

但是如果是递减,那么必定会导致出现后面的值先为0,不会导致传送的出现。

所以只要用 c 1 − 1 c_1 - 1 c1−1 加上后面需要的传送的步数就可以了。


CODE:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
#define endl '\n'
#define ll long long
#define int long long
int c[N];

void solve(){
    int n;cin >> n;
    for(int i = 1;i <= n;i++)cin >> c[i];

    if(n == 1){
        cout << c[1] -1 << endl;
        return;
    }

    int res = c[1] - 1;
    for(int i = 2;i <= n;i++){
        res += max(c[i] - c[i-1],0ll);
    }
    cout << res << endl;
}

signed main(){
    int T;cin >> T;
    while(T--){
        solve();
    }
    return 0;
}
相关推荐
兔兔兔兔17 分钟前
记录C++ 11
开发语言·c++
码匠许师傅15 分钟前
【C++ 面试真题】32. 聊聊 C++ 的原子变量与无锁编程
java·c++·面试
wabs66625 分钟前
关于栈【力扣150.逆波兰表达式求值的思考】
数据结构·c++·算法·leetcode··代码随想录
ZGi.ai26 分钟前
ZGI 父子分块:连接检索片段与完整上下文
人工智能·算法·知识库·企业ai·zgi·父子分块
IT毕设实战小研31 分钟前
基于大数据的二手车数据分析与预测
java·大数据·后端·爬虫·python·算法·课程设计
欧特克_Glodon32 分钟前
OpenCV计算机视觉开发入门与实践<十七>:点运算与灰度变换概述
c++·人工智能·opencv·计算机视觉
Allen_LVyingbo34 分钟前
医疗AI可扩展网格信息系统中网格计算技术的智能优化
大数据·人工智能·python·算法·机器学习·django·健康医疗
牛油果子哥q37 分钟前
C++序列式容器深度精讲:vector/list/deque底层实现、扩容原理、迭代器失效、性能对比、工程选型避坑
开发语言·c++·list
啦啦啦啦啦zzzz42 分钟前
升序链表的定时器
linux·服务器·网络·数据结构·c++·链表
WBluuue43 分钟前
数据结构与算法:带权并查集
数据结构·c++·算法