题意是求裁判最多说对了几次。
对于每次猜数,如果猜的数是,那么根据题目有三种情况:
-
数大了:说对的范围是
-
数小了:说对的范围是
-
数相等:说对的范围是
把上面这些区间中,重叠次数最多的区间求出来,就是数所在的区间;这个区间重叠的次数就是我们要的答案。
由于数字较大,所以用了个搞离散化。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<map>
#define MAXN 100010
#define MAX 2147483647
using namespace std;
int n,ans=-MAX,v[MAXN];
map<int,int> a;
inline int read(){
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
void work(){
int s=0;
for(auto x:a){
s+=x.second;
ans=max(ans,s);
}
printf("%d\n",ans);
}
void init(){
char ch;
n=read();
for(int i=1;i<=n;i++){
v[i]=read();
ch=getchar();
switch(ch){
case '.':{
a[v[i]]++;
a[v[i]+1]--;
break;
}
case '+':{
a[-MAX]++;
a[v[i]]--;
break;
}
case '-':{
a[v[i]+1]++;
a[MAX]--;
break;
}
}
}
}
int main(){
init();
work();
return 0;
}