【NOIP2016提高A组模拟9.17】序列

本文介绍了一种基于模4操作的算法优化方案,通过对比数组元素间的差异,并结合特定的数据约束条件,实现了对操作次数的有效减少。算法核心在于通过局部调整达到整体最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

这里写图片描述

Input

这里写图片描述

Output

这里写图片描述

Sample Input

1
5
2 1 3 0 3
2 2 0 1 0

Sample Output

1

Data Constraint

这里写图片描述

然后我们再考虑模,如果操作次数+4对正确性影响不大,那么我们什么时候才需要让某个地方再做4次以达到答案减小的目的呢,不难发现就是这种情况
如果这样的话我们的代价其实就是 左右两边的和 减去 中间的 (假设中间的是相同高度)
这里写图片描述
我们可以让中间全部加4,以此达到可以一次做完 那么这样答案就是左边的高度加上中间加四后高出来的高度

我们可以算出,在左边我们需要增加了多少次,在右边减去了多少,然后统计一下需要增加X次的个数(统计相邻的),这样我们每次找到一个最不亏的(亏的话干脆不加),就把答案加上增加的次数再减去少掉的次数就可以了。

代码:

var
 a,b,d:array [1..100001] of longint;
 i,j,k,n,t,ans:longint;
begin
 readln(t);
 for k:=1 to t do
  begin
   fillchar(d,sizeof(d),0);
   readln(n);
   for i:=1 to n do
    read(a[i]);
   for i:=1 to n do
   begin
    read(b[i]);
    a[i]:=(b[i]-a[i]+4) mod 4;
   end;
   ans:=a[1];
   for i:=1 to n-1 do
    if (a[i]<a[i+1]) then
     begin
      ans:=ans+a[i+1]-a[i];
      for j:=1 to a[i+1]-a[i]-1 do
       if (d[j]<>0) then
        begin
         ans:=ans-(a[i+1]-a[i]-j);
         d[j]:=d[j]-1;
         inc(d[a[i+1]-a[i]]);
         break;
        end;
     end
      else inc(d[a[i+1]+4-a[i]]);
   writeln(ans);
  end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值