最近正赶上期末,比较忙,上篇博文的子集生成的二进制算法这个坑估计要晚点填上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;
}