#include #include #include using namespace std; int main(){ int t,n; cin>>t>>n; int d[n+1],a[n+1],b[n+1]; for(int i=1;i<=n;i++){ cin>>d[i]; } a[0]=0; b[0]=0; for(int i=1;i<=n;i++){//处理A键的情况 a[i]=a[i-1]+2; for(int j=1;j<i;j++){//枚举最后一次使用A键的位置 if(d[i]-d[j]<=0){//如果敌人能够被击败 a[i]=min(a[i],a[j-1]+2+i-j-1);//从j-1到i-1使用A键,再加上第i个敌人使用B键击败 } } if(d[i]<=0){//如果敌人能够被击败 a[i]=min(a[i],b[i-1]+1);//直接使用B键击败 } } b[1]=1;//处理B键的情况 for(int i=2;i<=n;i++){ b[i]=a[i-1]+1;//使用A键击败前面的敌人,再使用B键击败第i个敌人 if(d[i]<=0){//如果敌人能够被击败 b[i]=min(b[i],b[i-1]+1);//直接使用B键击败 } for(int j=2;j<i;j++){//枚举最后一次使用B键的位置 if(d[i]-d[j]<=0){//如果敌人能够被击败 b[i]=min(b[i],a[j-1]+i-j+1);//从j-1到i-1使用A键,再使用B键击败第i个敌人 } } } cout<<b[n]<<endl;//输出结果 return 0; } 以上代码在输入为 3 3 1 2 1 2 3 2 1 2 3 的时候输出是什么内容:

代码的输出应该是2,即使用2次B键可以击败所有敌人。

具体来说,对于每个敌人,我们都要考虑使用A键还是B键来击败它。对于使用A键的情况,我们枚举最后一次使用A键的位置,从而得到最小代价。对于使用B键的情况,同样枚举最后一次使用B键的位置,从而得到最小代价。

最后,我们只需要输出使用B键击败所有敌人的最小代价。

C++ 代码优化:击败敌人的最小代价

原文地址: https://www.cveoy.top/t/topic/lB1k 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录