zl程序教程

您现在的位置是:首页 >  其它

当前栏目

一个在OJ的过程中遇到的不能理解的问题——E - Longest Strike

一个 理解 过程 不能 遇到 OJ Longest 问题
2023-09-11 14:22:52 时间

先说题目内容

在这里插入图片描述
在这里插入图片描述
因为有些紧急,我这里就不对上面的内容进行详细翻译了,大概意思就是找一个范围,使得这个范围里的数连续并重复出现k次,这里我可以先放一下我的code:

#include<stdio.h>
#include<iostream>
#include<map>
using namespace std;
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int num,time;
		cin>>num>>time;
		int a[200000];
		map<int,int> mp;
		//首先,输入数据,把数据构建成map类型的结构 
		for(int j=0;j<num;j++){
			cin>>a[j];
			if(mp.find(a[j])==mp.end()){
				mp.insert(pair<int,int>(a[j],1));
			}
			else{
				mp[a[j]]++;
			}
		}
		//遍历map,找到符合要求的输入数字 
		map<int, int>::iterator iter;
		iter = mp.begin();
		int mid[200000];
		int biao=0;
    	while(iter != mp.end()) {
        	if(iter->second>=time){
        		mid[biao++]=iter->first;
			}	
        	iter++;
    	}
    	//对遍历结果进行分析 
    	if(biao==0){
    		cout<<"-1"<<endl;
    		continue;
		}
    	int r=0,l=0;
    	int ar=0,al=0;
    	//最后问题简化为了对一个数组,找其中最长的连续子串的问题 
    	for(int j=0;j<biao-1;j++){
    		if(mid[j+1]-mid[j]==1){
    			r++;
			}
			else{
				if(r-l>ar-al){
					ar=r;
					al=l;
				}
				r++;
				l=r;
			}
		}
		if(r-l>ar-al){
			ar=r;
			al=l;
		}
		cout<<mid[al]<<" "<<mid[ar]<<endl;
	}
	return 0;
}

这个是没问题的版本,但是实际上,相较于这个版本,我之前一直有问题的版本只是在最后找连续序列的循环那里设置边界条件为:j<biao而不是上面的biao-1,这里我确实是没有太理解这点的区别,最后AC也是有一定运气成分。想请教一下各位大佬这里为什么会有问题,另外如果可以的话,简单说一下会显示出问题的测试样例。
谢谢啦