题意是求裁判最多说对了几次。

对于每次猜数,如果猜的数是aa,那么根据题目有三种情况:

  • 数大了:说对的范围是(inf,a](-\inf,a]

  • 数小了:说对的范围是[a,+inf)[a,+\inf)

  • 数相等:说对的范围是[a,a+1)[a,a+1)

把上面这些区间中,重叠次数最多的区间求出来,就是数所在的区间;这个区间重叠的次数就是我们要的答案。

由于数字较大,所以用了个mapmap搞离散化。

附代码:

#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;
}