第一题
刚开始用了三个for循环,求出了值,但是超时了,因为范围最大1e5:
#include <iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N];
int res;
int main()
{
// 请在此输入您的代码
int Max=-1;
int n=0;cin>>n;
int cnt;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;++i)
{
for(int j=i+1;j<=n;j++)
{
for(int k=j+1;k<=n;k++)
{
res=(a[i]+a[k])/a[j];
Max=max(Max,res);
}
}
}
cout<<Max<<endl;
return 0;
}
然后看题解的解法:
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],lmax[N],rmax[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
//先预处理出 lmax,rmax
int mx=0;
//lmax[i]标识在1-i中最大值是哪一个(包括i)
for(int i=1;i<=n;i++)
{
if(a[i]>mx) mx=a[i];
lmax[i]=mx;
}
mx=0;
//rmax[i]表示在i-n当中最大值
for(int i=n;i>=1;i--)
{
if(a[i]>mx) mx=a[i];
rmax[i]=mx;
}
int res=0;
//枚举每一个分母,比较的最大值
for(int i=2;i<n;i++)
{
res=max(res,(lmax[i-1]+rmax[i+1])/a[i]);
}
cout<<res<<endl;
return 0;
}
第二题
该题只让我们统计交换次数,我们并不需要真的交换。
一共只有两种情况,一种0在左边000011111,一种0在右边11110000。
#include <bits/stdc++.h>
using namespace std;
string s;
int n;
int main()
{
cin >> n;
cin >> s;
int sum1 = 0,sum2 = 0;
long long ans1 = 0,ans2 = 0;
for (char c : s) {
if (c == '1') {
sum1++;
}
else {
ans1 += sum1;
}
}
for (char c : s) {
if (c == '0') {
sum2++;
}
else {
ans2 += sum2;
}
}
cout << min(ans1,ans2);
return 0;
}
第四题
我们需要计算小蓝和小桥的战斗次数。假设小蓝的体力值为A,小桥的体力值为B,小桥的攻击力为C。
首先,我们计算小蓝需要的攻击次数。由于小桥的攻击力可能无法完全覆盖小蓝的体力值,我们需要用A除以C,然后向上取整,即 (A + C - 1) / C。这是因为最后一次攻击可能不足C,所以我们需要进行向上取整来确保小蓝的体力值能够完全被攻击消耗掉。
然后,我们计算小桥需要的攻击次数。由于小桥的攻击次数取决于小蓝的攻击次数,我们将B加上小蓝的攻击次数减去1,然后除以小蓝的攻击次数,即 (B + num - 1) / num。其中num是小蓝的攻击次数。因为之前向上取整+1,现在要减回去。这是在小蓝进行num次攻击后,小桥剩余的体力值。我们将其除以小蓝的攻击力num,得到小桥每次攻击减少的体力值,然后用小桥的剩余体力值除以这个值,得到小桥需要的攻击次数。
#include <iostream>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int A, B, C;
cin >> A >> B >> C;
int num = (A + C - 1) / C; // 计算小蓝攻击次数
int result = (B + num - 1) / num; // 计算小桥需要的攻击次数
cout << result << endl;
}
return 0;
}