⭐️个人主页:@小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

目录
经此一役小红所向无敌(模拟)

简单枚举会超时,可以根据题意做一下最大优化,先求出对立和光的血量最多能接收多少次对方的攻击,在判断剩下的最后一次攻击。
cpp
#include <iostream>
using namespace std;
using ll = long long;
int main()
{
ll a, h, b, k;
cin >> a >> h >> b >> k;
ll res = 0;
int cnt = min(h / b, k / a);
res += (a + b) * cnt;
h -= cnt * b;
k -= cnt * a;
if (h > 0 && k > 0)
{
res += a + b;
// 这次减完后必然至少有一方死亡
h -= b;
k -= a;
}
if (h > 0 || k > 0)
res += 10 * (h > 0 ? a : b);
cout << res << endl;
return 0;
}
连续子数组最大和(动态规划)

经典线性dp问题。

cpp
#include <iostream>
using namespace std;
const int N = 2e5 + 10;
int dp[N];
int res = -0x3f3f3f3f;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int x; cin >> x;
dp[i] = max(dp[i - 1], 0) + x;
res = max(res, dp[i]);
}
cout << res << endl;
return 0;
}
非对称之美(贪心)

- 如果字符串是回文串,并且不是由同一个字符组成,则最长非回文串就是把原回文串左右任意删去一个字符;
- 如果是回文串且所有字符相同,则答案为0;
- 如果本身不是回文串,则返回原字符串长度。
cpp
#include <iostream>
using namespace std;
int main()
{
string s;
cin >> s;
int n = s.size();
int l = 0, r = n - 1;
while (s[l] == s[r]) l++, r--;
if (l >= r) // 是回文串
{
// 判断所有字符是否都相同
int flag = 1;
for (auto ch : s)
{
if (s[0] != ch)
{
flag = 0;
break;
}
}
if (flag) cout << 0 << endl;
else cout << n - 1 << endl;
}
else cout << n << endl;
return 0;
}
本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~