题解 CF1154D 【Walking Robot】

如果您是看到蓝题难度就直接来看题解了
请您左转 返回题面 ,再好好看看题目
此题难度顶天 普及-


无良宣传一下博客wwwwww
文章列表 - 核融合炉心 - 洛谷博客

算法:贪心+模拟

在走一段路程的时候,

可以选择消耗普通电池,也可以选择消耗充电电池

选择不同的电池,对后续都会有影响

在选择电池的策略上,需要用到贪心的思想。

  • 具体怎么贪:

    当两个电池 非都没有电 ,且 未到终点 时,前进。

    对于某一条线段:
    1. 如果当前线段 不能被阳光照到

      • 若充电电池有电,选择消耗充电电池

      • 否则,选择消耗普通电池
    2. 如果当前线段 能被阳光照到

      • 如果充电电池电量已满,选择消耗充电电池

      • 否则,若普通电池有电,选择消耗普通电池,并使充电电池电量加 \(1\)


按照上述策略,将整个数轴扫一遍。

最后输出 所在点的编号 即可

复杂度为 \(O(n)\) , 对本题来说够用了。


巨丑的 AC代码:

#include<cstdio>
using namespace std;
int n,b,a;
int map[10000010];  //存数轴
int main()
{
    scanf("%d%d%d",&n,&b,&a);  //输入
    for(int i=1;i<=n;i++)
      scanf("%d",&map[i]);
    int i=0;  //存当前所在点
    int b1=b,a1=a;  //存当前电量
    while( (a1 || b1) && i++ <=n)
      {
        if(map[i]==0)  //无光情况
          if(a1)  a1--;
          else  b1--;
        if(map[i]==1)  //有光情况
          if(b1 && a1<a) b1--,a1++;
            else a1--;
        if(i==n) break;  //到达终点
      }
    printf("%d",i);
}

猜你喜欢

转载自www.cnblogs.com/luckyblock/p/11456388.html