码蹄集部分题目(2024OJ赛14期;前缀和+反悔贪心+栈)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值