社区讨论

切水题爆零?

P1420最长连号参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@m315wgqi
此快照首次捕获于
2024/11/03 13:38
去年
此快照最后确认于
2025/11/04 15:28
4 个月前
查看原帖

前言:本体不是题解,是求助!!!

先来看题目,这题目一看就知道:欸,不就是我们亲爱的快慢指针吗,随随便便AC好吧。
我的思路是这么想的:由于这个题目给的范围太大,开这么大数组100%RE,然后就用 vector nums[n],输入完了再定义一个left和fast指针对吧,让然后就循环再定义两个函数用max比较对吧,最后输出。
这边就是第一次爆零的CODE:
CPP
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n;
    cin >> n;
    vector<int> nums(n);
    for(int i = 0 ; i < n ; i ++){
        cin >> nums[i];
    }
    
    int slow = 0, fast = 1;
    int ans = 0, cnt = 0;
    
    while(fast < n){
        if(nums[fast] - nums[fast - 1] == 1){
            cnt++;
            fast++;
        }
        else{
            ans = max(ans, cnt); 
            cnt = 0;
            slow = fast;
            fast++;
        }
    }
    
    ans = max(ans, cnt);
    cout << ans << endl;
    
    return 0;
}

看来看去没看出来啥大毛病,放到编译器上一运行,欸?
CPP
5
1 2 3 4 5
4

--------------------------------
Process exited after 3.579 seconds with return value 0 (15.62 ms cpu time, 604 KB mem used).

Press ANY key to exit...
怎么是4,于是想到一个投机取巧的办法:
CPP
#include <iostream>
#include <vector>
using namespace std;

int main(){
	int n;
	cin >> n;
	vector <int> nums(n);
	for(int i = 0 ; i < n ; i ++){
		cin >> nums[i];
	}
	
	int slow = 0, fast = 1;
	int ans = 0, cnt = 0;
	while(fast < n){
		if(nums[fast] - nums[fast - 1] == 1){
			cnt ++;
			fast ++;
		}
		else{
			ans = max(ans, cnt);
			slow = fast;
			fast ++;
		}
		ans = max(ans, cnt);
	}
	
	ans = max(ans, cnt);
	cout << ans + 1 << endl;   //这边加1输出
	
	return 0;
}
不错,拿到一个点,20分。但是还是没A。。。

求解必关!!!!!!!!!!!!!

回复

6 条回复,欢迎继续交流。

正在加载回复...