NEUQ第二周练习题:好学的Coco(模拟)

最近正赶上期末,比较忙,上篇博文的子集生成的二进制算法这个坑估计要晚点填上QAQ (坑神)。上个星期,参加了东北大学秦皇岛分校的图灵杯,各种被吊打,感觉还是应该在算法上努力。
刷了一下他们实验班的题,慢慢找感觉,一般都是水题,但是14道题中有一道还是比较好玩的,对于一些想法感觉比较精妙,特此记录下来。
感谢这位博主的博文,传送门
好学的Coco(传送门)
这里写图片描述
这道题的思路:
1.首先确认一直在图书馆的人数(这里的想法很精妙)
2.在此人数的基础上,进行一定时间段的图书馆人口流动情况

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int main ()
{
    int n;
    while (cin>>n && n!=0)
    {
        int k2[100005];
        int k1[100005];
        char bz[100005];
        int cnt = 0;
        memset(k2,0,sizeof(k2));
        for (int i=0;i<n;i++)
        {
            cin>>bz[i];
            cin>>k1[i];
            /*
            首先,我们需要知道,如果我们一直在图书馆的情况下,如果我们要离开的话,只会在符号为'-'的时候,会离开。
            第二,我们需要知道,我们如果在此时间段内进入图书馆的情况下,我们必须先进入图书馆,也就是符号为‘+’的时候,但是我们如果在此时间段内进入就不算是在此时间段之前的本来就在图书馆的人数
            所以,这个问题精妙就在这里,我们通过模拟方式,进行图书馆本来有多少人的模拟

            第三,我们已经求出一直在图书馆的人数,在此人数上不断进行模拟人数进出的情况,求出每个人在进出情况下的最多的人数。
            */
            if (k2[k1[i]] == 0)
            {
                if (bz[i] == '-')
                {
                    k2[k1[i]]--;
                    cnt++;
                }
                else
                {
                    k2[k1[i]]++;
                }
            }
        }
        int max_cnt = cnt;
        for (int i=0;i<n;i++)
        {
            if (bz[i] == '-')
            {
                cnt--;
            }
            else
            {
                cnt++;
            }
            max_cnt = max(max_cnt,cnt);
        }
        cout<<max_cnt<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值