1🐋🐋🐋运动会进行中(钻石;前缀和)
时间限制:1.3秒
占用内存:128M
🐟题目描述
🐟输入输出格式
🐟样例
🐟题目思路
我们令-1表示女生、1表示男生,这样,如果某一区间内女生和男生的数量相等,那么求和将为0。
我们使用前缀和做这道题,用l[i]表示前缀和i出现的起始位置,r[i]表示前缀和i出现的末端位置,这说明,l[i]到r[i]区间内男女生数量相等,由此得出最大差值就是我们要的结果。
🐟代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,a[N],sum[N],l[2*N],r[2*N],ans;
int main( )
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==0) a[i]=-1;
sum[i]=sum[i-1]+a[i];//求前缀和
int tmp=sum[i]+n;//这里是保证其为正数,如果全部都是女生,那么前缀和将为-n
if(!l[tmp]) l[tmp]=i;//前缀和tmp还没有左起点
else r[tmp]=i;//前缀和tmp有左起点了,记录其右起点
}
for(int i=0;i<2*n;i++) ans=max(ans,r[i]-l[i]);
cout<<ans<<endl;
return 0;
}
2🐋🐋🐋矩阵01变(黄金;前缀和)
时间限制:1秒
占用内存:128M
🐟题目描述
🐟输入输出格式
🐟样例
🐟题目思路
前缀和的经典题目。
其实就是输出每个位置之前(xy为右下角的矩阵)的所有1的个数。
我们使用数组sum记录位置xy的前缀和。
🐟代码
#include<bits/stdc++.h>
using namespace std;
char a[110][110];
int b[110][110],sum[110][110];
int n,m;
int main( )
{
cin>>n>>m;
//输入
for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
//将输入处理成int型数据
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='1') b[i][j]=1;
}
}
//计算前缀和
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
sum[i][j]=sum[i-1][j]+su