农夫约翰的 N 头奶牛排成一排,每头奶牛都用其品种 ID 进行描述。
如果两头相同品种的牛靠得太近,它们就会吵架。
具体的说,如果同一品种的两头奶牛在队列中的位置相差不超过 K,我们就称这是一对拥挤的牛。
第一行包含两个整数 N 和 K。
接下来 N 行,每行包含一个整数表示队列中一头奶牛的品种 ID。
输出品种 ID 最大的拥挤奶牛对的品种ID。
如果不存在拥挤奶牛队,则输出 −1。
1≤N≤50000
1≤K<N
品种 ID 范围 [0,106]
6 3
7
3
4
2
3
4
4
一对品种 ID 为 3 的奶牛以及一对品种 ID 为 4 的奶牛属于拥挤奶牛对。
所以,最大拥挤奶牛对的品种 ID 为 4。
暴力法(答案正确输出超限理解思路即可)
#include<iostream>
#define P 50000
using namespace std;
struct COW//定义结构体牛牛储存
{
int ID;//牛牛ID
int index;//牛牛序号
};
int main()
{
int N,K,i,j;
cin>>N>>K;
struct COW cow[P];
for(i=0;i<N;i++)//对于牛牛结构体进行数据输入
{
cin>>cow[i].ID;
cow[i].index=i;
}
for(i=0;i<N-1;i++)//利用交换法对于牛牛结构体内的数据全体进行从大到小排序
{
for(j=i+1;j<N;j++)
{
if(cow[i].ID<cow[j].ID)
{
int t;
t=cow[i].ID;
cow[i].ID=cow[j].ID;
cow[j].ID=t;
int o;
o=cow[i].index;
cow[i].index=cow[j].index;
cow[j].index=o;
}
}
}
for(i=0;i<N-1;i++)//遍历结构体,进行筛选数据
{
j=i+1;
while(j<N&&cow[i].ID==cow[j].ID)//若相邻数据相同,计算数据相同的序号差值
{
int s=cow[i].index-cow[j].index;//存储差值
if(abs(s)<=K)
{
printf("%d",cow[j].ID);//满足条件进行输出
return 0;
}
j++;
}
}
printf("-1");//不满足条件输出-1
}
c++调用函数库简单循环法
#include<iostream>
#include<algorithm>//调用库函数max
using namespace std;
const int P=10000000;//数组数据用const常量开大点
int main()
{
int a[P];//数组中的下角标为牛牛ID,数组中元素的大小为牛牛的地址
int N,K;
cin>>N>>K;
int result=-1;//默认结果为1
for(int i=1;i<=N;i++)
{
int num;
cin>>num;//输入牛牛ID
//如果牛牛ID已经存在证明先前出现,进行判断
if(a[num]!=0&&i-a[num]<=K)//如果牛牛ID之前存在那么判断距离是否满足
{
result=max(result,num);//求取较大牛牛ID作为答案
}
a[num]=i;//若牛牛ID首次出现则为其存储牛牛地址
}
cout<<result;//输出结果
return 0;
}
#include<algorithm> max(a,b)求取a、b的最大值并用一个值接收