IncDec Sequence (差分)

题目地址

这道题可以用来检测一下你是否学会了差分,或者你可以更加透彻的理解差分

我们把 \(cf[]\) (差分)数组拿出了,就可以发现这道题就是每次可以在 \(cf[]\)中 选两个数,一个+1,一个-1,如何用最少的步数吧 \(cf[2]-cf[n]\) 中的所有数变成0

考虑到 \(cf[]\) 数组中有负数也有正数,我们设 \(p\) 是所以负数之和,\(q\) 是所以正数之和,我们肯定优先正负抵消,设正负抵消后还有 \(|p-q|\),这是我们让它和 \(cf[1]\) 或者 \(cf[n+1]\) 消,所以最短步数是 \(\text{max}(p,q)\),不同最后值是 \(|p-q|+1\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+7;
int n,p,q;
int a[N],cf[N];
signed main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;++i) {
        scanf("%lld",&a[i]);
        cf[i] = a[i] - a[i-1];
    }
    for(int i=2;i<=n;++i) {
        if(cf[i] > 0) p += cf[i];
        if(cf[i] < 0) q += -cf[i];
    }
    printf("%lld\n%lld\n",max(p,q),abs(p-q)+1);
    return 0;
}
全部评论

相关推荐

面了这么多场试,总有公司总喜欢压力面一个小时面试+手撕,哪里不会就点哪里,说了不会不会还继续追着问不尊重求职者,稍微有些细节记不清了,就开始怀疑项目真实性以及人格让求职者开摄像头但是自己不开,说话声音还贼小,pardon几次就开始不耐烦的不知道这个算不算,手撕的时候,面试官人跑了。。。最后快结束才来
一纸丿繁华丶:你换位思考一下,自己在职场被领导push麻了,身心俱疲,现在有个机会让你放松一下,体验一把上位者的感觉,还能看着那些高学历人才、未来自己的竞争者,抓耳挠腮、手足无措的样子,没给你当场笑出来就不错了,理解一下面试官吧。
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
那一天的Java_Java起来:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务