【笔试训练】day20

文章介绍了三个编程问题:1)计算小红与对手在有限攻击次数后的生存策略;2)求解连续子数组的最大和,注意边界条件;3)判断字符串是否为非对称回文。展示了如何运用递归和动态规划解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.经此一役小红所向无敌

默认小红血量无限。直接计算出经过几轮攻击后,会出现人员伤亡。

对于对立来说他最多承受n轮光的攻击,对于光来说,他最多承受立得m轮攻击。

所以在经过min(n,m)轮回合之后,他们两个人至少死一个。活下来的人就自杀。

代码:

#include <iostream>
using namespace std;
typedef long long LL;

int main() {
    LL a,h,b,k;
    cin>>a>>h>>b>>k;

    LL cnt1=(h-1+b)/b;
    LL cnt2=(k-1+a)/a;
    LL cnt=min(cnt1,cnt2);
    LL ans=cnt*(a+b);
  //  cout<<cnt1<<" "<<cnt2<<endl;
    if(cnt1==cnt2){
        cout<<ans<<endl;
        return 0;
    }else if(cnt1>cnt2){
        ans+=a*10;
    }else{
        ans+=b*10;
    }

    cout<<ans<<endl;
   return 0;
}

2.连续子数组得最大和

遇到这种连续得区间题目,要么枚举左右端点,要么就是枚举右端点。

枚举每一个区间的右端点,f[i]表示以第i个元素结尾的区间的最大和是多少。

所以f[i]=max(f[i-1]+a[i],a[i])

哦对了这是一个sb题目,数组开1e5居然过不了。得开1e6。

代码:

#include <iostream>
#include<algorithm>
using namespace std;
const int N=1e6+100;
long long f[N];

int main() {
   int n;
   cin>>n;
    long long ans=-1e16;
   for(int i=1;i<=n;i++){
    cin>>f[i];
    f[i]=max(f[i-1]+f[i],f[i]);
    ans=max(f[i],ans);
   }
   cout<<ans<<endl;
  return 0;
}
// 64 位输出请用 printf("%lld")

3.非对称之美

思考这样一个事实:如果下标[l,r]是一个回文串,那么[l+1,r]一定不是回文串,除非里面元素全部相等。自己去推一下就好了。

代码:

#include <iostream>
#include<string>
using namespace std;

int main() {
   string str;
   cin>>str;
   if(str.size()<=1){
    cout<<0<<endl;
    return 0;
   }
   int l=0;
   int r=str.size()-1;
   
   while(l<r){
    if(str[l]==str[r]){
        l++;
        r--;
    }else{
        cout<<str.size()<<endl;
        return 0;
    }
   }
   l=1;
   r=str.size()-1;
   while(l<r){
     if(str[l]==str[r]){
        l++;
        r--;
    }else{
        cout<<str.size()-1<<endl;
        return 0;
    }
   }
    cout<<0<<endl;
   return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值