题解 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);
}
posted @ 2019-09-03 23:15  Luckyblock  阅读(171)  评论(0编辑  收藏  举报