简单的模拟一下
挖矿策略
临近矿道优先 每个消耗体力*1
远离矿道时
- 先处理临近矿道处被挖掉的 每个消耗体力*1
- 再处理临近矿道处未被挖掉的 每个消耗体力*2
如果体力不足以继续模拟直接停止
时间复杂度O(n)
#include<iostream>
using namespace std;
int n,h;
char a[6][1010];
int main(){
cin>>n>>h;
for(int i=1;i<=5;++i){
cin>>(a[i]+1);
}
if(h==0){
cout<<0<<endl;
return 0;
}
int ans=0;
for(int i=1;i<=n;++i){//临近矿道
if(a[2][i]=='*'){
h--;//消耗体力
a[2][i]='.';//挖掉
ans++;//计数
if(h==0)break;//体力不足
}
if(a[4][i]=='*'){
h--;
a[4][i]='.';
ans++;
if(h==0)break;
}
}
if(h)//体力充足
for(int i=1;i<=n;++i){//远离矿道 临近矿道处被挖掉
if(a[2][i]=='.'&&a[1][i]=='*'){
h--;
a[1][i]='.';
ans++;
if(h==0)break;
}
if(a[4][i]=='.'&&a[5][i]=='*'){
h--;
a[5][i]='.';
ans++;
if(h==0)break;
}
}
if(h>=2)
for(int i=1;i<=n;++i){//远离矿道 临近矿道处未被挖掉
if(a[1][i]=='*'){
ans++;
h-=2;
a[1][i]='.';
if(h<2)break;
}
if(a[5][i]=='*'){
ans++;
h-=2;
a[5][i]='.';
if(h<2)break;
}
}
cout<<ans<<endl;
}