目录
一、题目描述:
P1420 最长连号
题目描述
输入长度为 n 的一个正整数序列,要求输出序列中最长连号的长度。
连号指在序列中,从小到大的连续自然数。
输入格式
第一行,一个整数 n。
第二行,n 个整数 ai,之间用空格隔开。
输出格式
一个数,最长连号的个数。
输入输出样例
输入 #1复制
10 1 5 6 2 3 4 5 6 8 9
输出 #1复制
5
说明/提示
数据规模与约定
对于 100%100% 的数据,保证 1≤n≤10^4,1≤ai≤10^9。
二、写题思路及代码:
思路:
本题实际上是找一个按从小到大连续的数列,但我确错认为是找重复出现的数字,并去掉就是按顺序排列的(😭),完全错误。做法是通过双重循环遍历数组,统计每个元素的出现次数,并找出出现次数最多的元素,最后输出这个元素的出现次数。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int ans = 0;
// 遍历数组中的每个元素
for (int i = 0; i < n; i++) {
int cnt = 0;
// 统计当前元素在数组中出现的次数
for (int j = 0; j < n; j++) {
if (nums[i] == nums[j]) cnt++;
}
// 更新答案,记录当前元素的出现次数
ans = max(ans, cnt);
}
cout << ans << endl;
return 0;
}
三、正确代码及知识总结:
由上述知:本题是找一个最长的按从小到大排序的数列,实际上就是找n个数中的最大上升子数列。
代码:
#include <iostream>
using namespace std;
int main()
{
int n, ans = 0, temp, b, max = 1; // 定义变量,n 为数组长度,ans 为出现次数最多的元素的出现次数,temp 为临时变量,b 为当前元素,max 为当前元素的出现次数
cin >> n; // 输入数组长度
cin >> b; // 输入第一个元素
for (int i = 1; i <= n - 1; i++) // 遍历数组中的每个元素
{
cin >> temp; // 输入当前元素
if (temp == b + 1) // 如果当前元素等于前一个元素加 1
{
max++; // 则当前元素的出现次数加 1
}
else // 否则
{
max = 1; // 当前元素的出现次数重置为 1
}
if (ans < max) // 如果当前元素的出现次数大于之前记录的出现次数
{
ans = max; // 更新出现次数最多的元素的出现次数
}
b = temp; // 更新当前元素
}
cout << ans << endl; // 输出出现次数最多的元素的出现次数
return 0;
}
知识总结:最大上升子数列(摘自https://blog.csdn.net/pangyou3s/article/details/137000887,胖柚工作室)

原文链接:https://blog.csdn.net/pangyou3s/article/details/137000887
1314

被折叠的 条评论
为什么被折叠?



