Bzoj 3523 [Poi2014]Bricks

本文介绍了一个解决颜色匹配问题的贪心算法实现,通过维护一个最大堆来选择与前一个元素颜色不同的最多数量的颜色。算法考虑了尾部颜色的优先级,并解决了当堆顶元素与前一元素颜色相同时的特殊情况。

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

原题网址:http://www.lydsy.com/JudgeOnline/problem.php?id=3523
很显然的贪心,每次找不和前面元素重复的最多的,尾部颜色在数量相同时优先级更高。WA了好多发因为姿势丑,如果堆顶元素和前面元素一样只要先把堆顶拿出来就好了。。

type
  rec=record
        c,cnt:longint;
      end;  
const
  MAXN=1000050;
var
  heap:array[0..MAXN] of rec;
  a,c,cp:array[0..MAXN] of longint;
  n,m,st,nd,i,cnt:longint;
  t:rec;
procedure swp(var a,b:longint);
  var t:longint;
  begin t:=a;a:=b;b:=t; end;
procedure swap(a,b:longint);
  begin
    swp(heap[a].c,heap[b].c);
    swp(heap[a].cnt,heap[b].cnt);
  end;
operator >(a,b:rec)c:boolean;
  begin exit((a.cnt>b.cnt)or(a.cnt=b.cnt)and(a.c=nd));end;  
procedure heapup(x:longint);
  begin
    while ((x>1)and(heap[x]>heap[x>>1])) do
      begin
        swap(x,x>>1);
        x:=x>>1;
      end;
  end;
procedure heapdown(x:longint);
  var
    e:longint;
  begin
    while ((x<<1<=cnt)and(heap[x<<1]>heap[x])or(x<<1+1<=cnt)and(heap[x<<1+1]>heap[x])) do
      begin
        e:=x<<1+ord((x<<1+1<=cnt)and(heap[x<<1+1].cnt>heap[x<<1].cnt));
        swap(x,e);
        x:=e;
      end;
  end;
procedure push(x:rec);
  begin
    inc(cnt);
    heap[cnt]:=x;
    heapup(cnt);
  end;
procedure poop;
  begin
    heap[1]:=heap[cnt];
    dec(cnt);
    heapdown(1);
  end;
procedure no_solution;
  begin
    writeln(0);
    halt;
  end;
begin
  read(n,st,nd);m:=0;
  for i:=1 to n do read(a[i]);
  cp:=a;
  for i:=1 to n do inc(m,a[i]);
  dec(a[st]);if (a[st]<0) then no_solution;
  dec(a[nd]);if (a[nd]<0) then no_solution;
  for i:=1 to n do
    if (a[i]>0) then
      begin
        t.c:=i;
        t.cnt:=a[i];
        push(t);
      end;
  c[1]:=st;c[m]:=nd;
  for i:=2 to m-1 do
    if (heap[1].c<>c[i-1])
      then
        begin
          c[i]:=heap[1].c;
          dec(heap[1].cnt);
          if (heap[1].cnt=0)
            then poop
            else heapdown(1);
        end
      else
        begin
          if (cnt=1) then no_solution;
          t:=heap[1];poop;
          c[i]:=heap[1].c;
          dec(heap[1].cnt);
          if (heap[1].cnt=0)
            then poop
            else heapdown(1);
          push(t);  
        end;
  if (c[m]=c[m-1]) then no_solution;  
  for i:=1 to m-1 do
    write(c[i],' ');
  writeln(c[m]);
end.
内容概要:本文档详细介绍了基于MATLAB实现多目标差分进化(MODE)算法进行无人机三维路径规划的项目实例。项目旨在提升无人机在复杂三维环境中路径规划的精度、实时性、多目标协调处理能力、障碍物避让能力和路径平滑性。通过引入多目标差分进化算法,项目解决了传统路径规划算法在动态环境和多目标优化中的不足,实现了路径长度、飞行安全距离、能耗等多个目标的协调优化。文档涵盖了环境建模、路径编码、多目标优化策略、障碍物检测与避让、路径平滑处理等关键技术模块,并提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,对无人机路径规划和多目标优化算法感兴趣的科研人员、工程师和研究生。 使用场景及目标:①适用于无人机在军事侦察、环境监测、灾害救援、物流运输、城市管理等领域的三维路径规划;②通过多目标差分进化算法,优化路径长度、飞行安全距离、能耗等多目标,提升无人机任务执行效率和安全性;③解决动态环境变化、实时路径调整和复杂障碍物避让等问题。 其他说明:项目采用模块化设计,便于集成不同的优化目标和动态环境因素,支持后续算法升级与功能扩展。通过系统实现和仿真实验验证,项目不仅提升了理论研究的实用价值,还为无人机智能自主飞行提供了技术基础。文档提供了详细的代码示例,有助于读者深入理解和实践该项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值