题解 CF1154D 【Walking Robot】
如果您是看到蓝题难度就直接来看题解了
请您左转 返回题面 ,再好好看看题目
此题难度顶天 普及-
无良宣传一下博客wwwwww
文章列表 - 核融合炉心 - 洛谷博客
算法:贪心+模拟
在走一段路程的时候,
可以选择消耗普通电池,也可以选择消耗充电电池
选择不同的电池,对后续都会有影响
则 在选择电池的策略上,需要用到贪心的思想。
-
具体怎么贪:
当两个电池 非都没有电 ,且 未到终点 时,前进。
对于某一条线段:
-
如果当前线段 不能被阳光照到:
-
若充电电池有电,选择消耗充电电池
-
否则,选择消耗普通电池
-
-
如果当前线段 能被阳光照到 :
-
如果充电电池电量已满,选择消耗充电电池
-
否则,若普通电池有电,选择消耗普通电池,并使充电电池电量加 \(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);
}
作者@Luckyblock,转载请声明出处。