如何修正C++代码以打印数组中最长连续符合条件段的首尾索引?
解决傍晚测量值高于早晨的最长连续时间段索引问题
看起来你现在的代码只是把所有傍晚值高于早晨的日子索引都列出来了,但没处理连续时间段的逻辑,更没找到其中最长的那段。咱们来一步步改好它。
原代码的问题分析
原代码的firstResult数组只是把每个符合条件的索引单独存起来,完全没考虑这些索引是不是连续的——比如输入里第1天符合、第2天不符合、第3-5天符合,原代码就把1、3、4、5都输出了,但我们要的是最长的连续段3-5。
修改思路
我们需要几个变量来跟踪连续段的状态:
current_start:当前正在统计的连续符合条件段的起始索引(题目要求索引从1开始)current_length:当前连续段的长度max_start/max_end:记录最长连续段的首尾索引max_length:最长连续段的长度
遍历数据时遵循以下逻辑:
- 当遇到某一天符合条件(傍晚>早晨):
- 如果之前没有在统计连续段(比如刚从不符合的日子过来,或者是第一天),就初始化
current_start和current_length - 如果已经在统计连续段,就延长当前段的长度
- 每次符合条件时,检查当前段是否比已记录的最长段更长,若是则更新最长段的首尾索引
- 如果之前没有在统计连续段(比如刚从不符合的日子过来,或者是第一天),就初始化
- 当遇到不符合条件的日子,重置当前段的统计状态
修改后的代码
#include <iostream> using namespace std; struct Measure { int morning, evening; }; int main() { Measure measures[300]; int n; cin >> n; for (int i = 0; i < n; i++) { cin >> measures[i].morning >> measures[i].evening; } // 初始化跟踪变量,题目要求索引从1开始计数 int current_start = 0; int current_length = 0; int max_start = 0; int max_end = 0; int max_length = 0; for (int i = 0; i < n; i++) { if (measures[i].evening > measures[i].morning) { if (current_length == 0) { // 开启新的连续符合段 current_start = i + 1; current_length = 1; } else { // 延续当前连续段 current_length++; } int current_end = i + 1; // 更新最长段记录 if (current_length > max_length) { max_length = current_length; max_start = current_start; max_end = current_end; } } else { // 不符合条件,重置当前段统计 current_length = 0; } } // 输出最长连续段的首尾索引 cout << max_start << " " << max_end << endl; return 0; }
测试验证
输入数据:6 100 120 200 122 170 190 100 222 150 155 75 60
代码会正确输出3 5,因为第3-5天是最长的连续符合条件的时间段。
内容的提问来源于stack exchange,提问作者Abrar Ahmed
相关产品推荐
相关产品推荐

