IncDec Sequence

链接

既然题目要求最终所有数字都要相等,是不是意味着所有数字只差为0?

依据于此,我们可以创建一个长度为n的数组,第一个元素就是题目输入的第一个值,往后都是差值

比如2 3 4 5 7 4得到的结果是2 1 1 1 2 -3目标(? 0 0 0 0 0,第一个元素不确定)

我们对区间[l,r]进行操作,会发现新数组l和r+1的元素进行了改变,l的改变与操作相同,r+1则相反

特别的,如果r位于最后一位,那么新数组只有l进行了更改

我们发现了规律:操作时新数组只有至多两个元素改变,而且两个元素改变相反(一个加一,另一个减一),如果只改变一个元素,我们可以进行加一或减一

不难想到,同时对正数负数操作是最快的,刚刚那个数组我们可以让前面的整数减一,后面的负数加一

这样,我们操作3次可以得到 2 0 0 0 2 0(当然2 1 1 0 0 0也行,只要满足第一个元素后面相加为2即可),此时我们可以更改两个也可以更该一个(更改两个是第一个元素加一,后面的2减一,更改一个是后面的2减一,第一个不变)

不难看出,最终答案有3种(均为2,3或4),更改次数为3+2=5种

总结规律,更改次数为第一个元素之后的正数和与负数和的最大值,即max(正数,|负数|), 种数为(|正数-|负数||+1)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    
    vector<long long>num(n),diff(n);
    for(int i=0;i<n;i++){
       cin>>num[i];
        if(i==0)diff[i]=num[i];
        else diff[i]=num[i]-num[i-1];
    }
    long long sum=0,negative=0;
    for(int i=1;i<n;i++){
        sum+=abs(diff[i]);
        negative+=diff[i]<0?-diff[i]:0;
    }
    cout<<max(sum-negative,negative)<<endl;
    cout<<abs(sum-2*negative)+1<<endl;
    
}

时间复杂度:O(n)

空间复杂度:O(n)

全部评论

相关推荐

2025-12-21 12:15
门头沟学院 Java
1、常见的方案有数据库自增ID、UUID、Redis生成和雪花算法。实际分布式场景下,雪花算法更常用,它将ID分为时间戳、机器ID和序列号三部分,性能高且趋势递增。但要注意时钟回拨问题,可通过记录上次生成时间戳或使用扩展版算法解决。2、雪花算法的ID在时间戳维度是递增的,但同一毫秒多机器生成的ID可能乱序。如需严格单调递增,可用数据库号段模式:服务启动时申请一个ID范围,内存分配用完后再次申请,这样单服务内ID严格递增。3、redo&nbsp;log是InnoDB的物理日志,崩溃恢复时重放提交的事务;undo&nbsp;log记录数据修改前的状态,用于回滚和MVCC读;binlog是MySQL&nbsp;Server层的逻辑日志,用于主从同步和数据备份。4、主库将变更写入binlog,从库通过IO线程拉取binlog到relay&nbsp;log,再由SQL线程重放SQL实现同步。5、优化索引时要减少回表和利用覆盖索引。索引失效常见于:违反最左前缀、对索引列计算、类型转换、LIKE左模糊匹配、OR连接非索引列等情况。6、InnoDB索引用B+树实现,联合索引按字段从左到右排序。如果跳过左侧字段,因为b的值在全局无序,无法利用索引快速定位,导致失效。7、当元素少且小时,用压缩列表节省内存;当元素多或大时,自动转为&nbsp;"跳跃表+字典"&nbsp;组合。跳跃表负责按分值排序,支持高效范围查询;字典负责成员到分值的映射,实现O(1)快速查分数。这种设计平衡了内存与性能。8、跳表插入节点时,从最高层向右向下逐层搜索并记录小于目标的分值位置(update[]);随后随机生成新节点层高,创建节点并按层将其插入:每层链接到对应update[]节点之后,并指向其原后继;最后更新跳表的最大层高和节点总数,实现高效定位与平衡插入。9、Redis有6种淘汰策略,常用的是allkeys-lru和allkeys-lfu。LRU淘汰最近最少访问的,LFU淘汰访问频率最低的。LFU更适合长期热点场景,而LRU对突发流量更敏感。10、Redis用惰性删除+定期删除组合:访问key时检查过期,同时后台定期抽样清理过期key。当内存不足时,再根据淘汰策略主动删除数据。11、TCP通过滑动窗口实现流量控制:接收方在ACK包中携带窗口大小。发送方根据这个窗口动态调整发送数据量,避免接收方缓冲区溢出。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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