问题描述
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式:
第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
样例输入
5
100
150
150
200
250
样例输出
150
思路
这是1维的动态规划
思路类似于最大子段和
建立一个动态更新的数组b[i]
b[i]的值表示从a[1]到a[i]出现次数最多的元素值
第一次提交
#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
//这是1维的动态规划
//思路类似于最大子段和
//建立一个动态更新的数组b[i]
//b[i]的值表示从a[1]到a[i]出现次数最多的元素值
int main()
{
int n;
cin>>n;
int a[n+1];
int b[n+1];
for(int i=1;i<=n;i++)
cin>>a[i];
b[1]=a[1];
int frequncy=1;
//因为是已经排好序了的
for(int i=2;i<=n;i++){
if(b[i-1]==a[i]){
b[i]=b[i-1];
frequncy++;
}
else{
if(a[i+frequncy]==a[i]){
b[i]=a[i];//说明这个比之前的出现概率更高,更新b[i]
frequncy=1;//因为是for循环,i++一步一步来,这里给frequncy置1
}else{
b[i]=b[i-1];//如果a[i]不能成为最优解,b[i]=b[i-1]
}
}
}
cout<<b[n];
return 0;
}
错误样例1:
输入0
无输出
错误样例2
输入-1
无输出
因此做改进,如果n<=1,return0
第二次提交
#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
//这是1维的动态规划
//思路类似于最大子段和
//建立一个动态更新的数组b[i]
//b[i]的值表示从a[1]到a[i]出现次数最多的元素值
int main()
{
int n;
cin>>n;
if(n<=1)
return 0;
int a[n+1];
int b[n+1];
for(int i=1;i<=n;i++)
cin>>a[i];
b[1]=a[1];
int frequncy=1;
//因为是已经排好序了的
for(int i=2;i<=n;i++){
if(b[i-1]==a[i]){
b[i]=b[i-1];
frequncy++;
}
else{
if(a[i+frequncy]==a[i]){
b[i]=a[i];//说明这个比之前的出现概率更高,更新b[i]
frequncy=1;//因为是for循环,i++一步一步来,这里给frequncy置1
}else{
b[i]=b[i-1];//如果a[i]不能成为最优解,b[i]=b[i-1]
}
}
}
cout<<b[n];
return 0;
}