链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
我们刚刚学了二分查找——所谓二分查找就是在一堆有序数里找某个符合要求的数。在学完二分查找之后如果让你玩猜数游戏(裁判选定一个目标数字,你说一个数裁判告诉你是高了还是低了直到你猜到那个数)的话,显然你会用二分的方式去猜。
但是不是每一个玩猜数游戏的人都知道二分是最好,甚至一个健忘的玩家都有可能在得到裁判回答的下一个瞬间就忘了他之前问了什么以及裁判的回答),而现在更可怕的是,这个告诉你猜的数是高还是低的裁判他也很健忘,他总是薛定谔的记得这个目标数字,也就是说他的回答有可能出错。我们已经不关心这个不靠谱的游戏本身了,我们更关心裁判这个薛定谔的记得到底有几个是记得......
现在给出这个健忘的玩家的所有猜测和裁判的所有回答,问裁判最多能有多少次是记得目标数字的,即裁判的回复是符合情况的。
输入描述:
第一行包含一个正整数n,表示裁判的回答数(也是玩家的猜数次数)。
接下来n行,首先是猜的数,然后是一个空格,然后是一个符号。符号如果是“+”说明猜的数比答案大,“-”说明比答案小,“.”说明猜到了答案。
输出描述:
包含一个正整数,为裁判最多有多少个回答是正确的。
示例1
输入
4 5 . 8 + 5 . 8 -
输出
3
说明
当目标数组是5时,5 . 5 . 8 + 这三个回答都是正确的
备注:
n≤100000
所有数的大小都小于int类型最大值。
思路:
那么枚举每个数,判断最多符合条件的。这是最初的思路,当然暴力过不了;
想怎么优化,我们想知道对于每个数,其符合条件的个数k;
例如:
5 . 则整数5 +1
6 + 则整数大于6的所有数 +1
5 . 5 +1
8 - 小于8的所有数+1
序列上操作,那么差分可以满足;
include<bits/stdc++.h>
using namespace std;
map<long long,int> mp;
long long MAX_INT=1e10;
long long cnt[100007];
int main(){
int n,i;
long long check;
char op;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%lld %c",&check,&op);
//printf("op : %c\n",op);
cnt[i]=check;
if(op=='+') {
mp[-MAX_INT]++;
mp[check]--;
} else if(op=='-') {
mp[check+1]++;
mp[MAX_INT]--;
}
else if(op=='.'){
mp[check]++;
mp[check+1]--;
}
}
int sum=0,ans=-MAX_INT;
// sum+=mp[-MAX_INT];
// printf("%d\n",sum);
// ans=max(ans,sum);
// for(i=1;i<=n;i++){
// sum+=mp[cnt[i]];
// printf("%d\n",sum);
// ans=max(ans,sum);
// }
// printf("%d\n",sum);
// ans=max(ans,sum+mp[MAX_INT]);
for(auto x: mp){
sum+=x.second;
ans=max(ans,sum);
}
printf("%d\n",ans);
}