经此一役小红所向无敌
经过重重困难,对立和光终于来到魔王城,和最终的大魔王——小红进行决战。
已知小红的血量是 1099999999910^{999999999}10999999999 。
对立的攻击力是 aaa ,血量是 hhh 。
光的攻击力是 bbb ,血量是 kkk 。
每回合光先对小红发起攻击,然后对立对小红发起攻击,然后小红展开幻术,令光和对立同时互相攻击。
每次攻击后,受击者的血量会减掉攻击者的攻击力。
当光和对立其中一人死亡后,另一人会悲痛欲绝,对小红发出自己攻击力*10的伤害的大招,然后自杀。(若两人同时死亡,则两人都无法发出大招)
小红想知道,弱小的光和对立,她们能对自己造成多少点伤害?
输入描述:
一行 444 个正整数 aaa , hhh , bbb , kkk ,用空格隔开。
1≤a,b,h,k≤1091\leq a,b,h,k\leq1 0^91≤a,b,h,k≤109
输出描述:
一个正整数,代表小红受到的伤害。
#include <iostream>
using namespace std;
typedef long long LL;
LL a, h, b, k;
int main()
{
cin >> a >> h >> b >> k;
LL ret = 0;
// 1. 计算互砍多少回合
LL n = min(h / b, k / a);
ret += n * (a + b);
// 2. 计算剩余⾎量
h -= n * b;
k -= n * a;
// 3. 判断是否都还活着
if (h > 0 && k > 0)
{
h -= b;
k -= a;
ret += a + b;
}
// 4. 判断是否会放⼤
if (h > 0 || k > 0)
{
ret += 10 * (h > 0 ? a : b);
}
cout << ret << endl;
return 0;
}
连续子数组最大和
描述
给定一个长度为 � n 的数组,数组中的数为整数。
请你选择一个非空连续子数组,使该子数组所有数之和尽可能大,子数组最小长度为1。求这个最大值。
输入描述:
第一行为一个正整数 � n ,代表数组的长度。 1≤�≤2∗1051≤n≤2∗105
第二行为 � n 个整数 ��a**i,用空格隔开,代表数组中的每一个数。 ∣��∣≤102∣a**i∣≤102
输出描述:
连续子数组的最大之和。
贪心
#include <chrono>
#include <iostream>
#include <climits>
using namespace std;
int n;
const int N = 2e5+10;
int a[N];
int main()
{
int ans = INT_MIN;
cin>>n;
for(int i = 0;i<n;++i){
cin>>a[i];
ans = max(ans,a[i]);
}
int sum = 0;
for(int i = 0;i<n;++i)
{
sum += a[i];
if(sum<0){
sum = 0;
}
if(sum)
ans = max(sum,ans);
}
cout<<ans<<'\n';
return 0;
}
动态规划
#include <iostream>
#include <climits>
using namespace std;
int n;
const int N = 2e5+10;
int a[N],dp[N];
int main()
{
//dp[i]以i为结尾的所有子数组中,最大和是多少
cin>>n;
int ans = INT_MIN;
for(int i = 1;i<=n;++i)
{
cin>>a[i];
dp[i] = max(dp[i-1],0)+a[i];
ans = max(ans,dp[i]);
}
cout<<ans;
return 0;
}
非对称之美
链接:https://ac.nowcoder.com/acm/problem/214851
来源:牛客网
给出一个字符串,求最长非回文子字符串的长度
输入描述:
在一行中给出一个字符串 s,1≤∣s∣≤107s, 1 \le |s| \le 10^7s,1≤∣s∣≤107
输出描述:
一个整数
s = input()
n = len(s)
if s == s[0]*n:
print(0)
else:
print(n - 1 if s==s[::-1] else n)